Performance 带中间运算符的Oracle查询性能

Performance 带中间运算符的Oracle查询性能,performance,oracle,query-optimization,Performance,Oracle,Query Optimization,我有一张大约1亿行的桌子。必须在操作员之间使用。我看到查询运行得非常慢 我在trader表中添加了两个索引,一个是t.name,第二个是t.amount和t.price 查询执行得非常慢。在操作员之间使用时,价格和金额索引是否有帮助。还有,我如何优化这个 select t.trader_id, t.name, t.city, t.state from trader t where exists ( SELECT null FROM city_present p,city_state c

我有一张大约1亿行的桌子。必须在操作员之间使用。我看到查询运行得非常慢

我在trader表中添加了两个索引,一个是t.name,第二个是t.amount和t.price

查询执行得非常慢。在操作员之间使用时,价格和金额索引是否有帮助。还有,我如何优化这个

select t.trader_id, t.name, t.city, t.state 
from trader t where exists 
( 
SELECT null 
FROM city_present p,city_state c 
WHERE p.name = 'TEST_TEST'
AND c.city = p.city
AND c.state = p.state
AND t.city = c.city 
AND t.state = c.state 
AND t.price IS NOT NULL 
AND t.price between (25.00000 , 58.000000) 
AND t.amount IS NOT NULL 
AND t.amount BETWEEN (-2500.0000 , 2800.000) 
) 
AND t.name = 'john test' 
AND t.is_valid= 1

选择性是优化绩效的关键-在城市名称为“test”的城市/州,你可能会有比价格在25到58之间、金额在-2500到2800之间少得多的称为“john test”的交易员,其is_valid=1

因此,我建议在trader表上设置一个关于name、city、state和is_valid(按该顺序)的索引,然后尝试以下查询:

SELECT t.trader_id, t.name, t.city, t.state 
FROM trader t
JOIN (select distinct p.city, p.state
      from city_present p
      JOIN city_state s
        ON s.city  = p.city AND s.state = p.state 
      WHERE p.name = 'TEST_TEST') c
  ON t.city  = c.city AND t.state = c.state 
WHERE t.price between (25.00000 , 58.000000) 
  AND t.amount BETWEEN (-2500.0000 , 2800.000) 
  AND t.name = 'john test' 
  AND t.is_valid= 1

选择性是优化绩效的关键-在城市名称为“test”的城市/州,你可能会有比价格在25到58之间、金额在-2500到2800之间少得多的称为“john test”的交易员,其is_valid=1

因此,我建议在trader表上设置一个关于name、city、state和is_valid(按该顺序)的索引,然后尝试以下查询:

SELECT t.trader_id, t.name, t.city, t.state 
FROM trader t
JOIN (select distinct p.city, p.state
      from city_present p
      JOIN city_state s
        ON s.city  = p.city AND s.state = p.state 
      WHERE p.name = 'TEST_TEST') c
  ON t.city  = c.city AND t.state = c.state 
WHERE t.price between (25.00000 , 58.000000) 
  AND t.amount BETWEEN (-2500.0000 , 2800.000) 
  AND t.name = 'john test' 
  AND t.is_valid= 1

你为什么要关注两者之间的关系?还有很多其他的过滤器。你能提供你查询的执行计划吗?t.price不为空,t.amount不为空是没有用的,因为你的t.price介于(25.00000,58.000000)和t.amount之间(-2500.0000,2800.000)相应地,在没有发布查询执行计划的情况下问一个关于查询性能的问题是毫无意义的。您好,我注意到您已经将近40分钟没有活动了,而且还没有回答一个问题。请记住,堆栈溢出移动得很快。如果你想得到最好的答案,请在提出问题后的前30分钟到一个小时内,随时准备立即回答评论中的问题。你为什么要关注中间的问题?还有很多其他的过滤器。你能提供你查询的执行计划吗?t.price不为空,t.amount不为空是没有用的,因为你的t.price介于(25.00000,58.000000)和t.amount之间(-2500.0000,2800.000)相应地,在没有发布查询执行计划的情况下问一个关于查询性能的问题是毫无意义的。您好,我注意到您已经将近40分钟没有活动了,而且还没有回答一个问题。请记住,堆栈溢出移动得很快。如果你想得到最好的答案,请在提问后的前30分钟到一个小时内,随时准备立即回答评论中的问题。我的要求。已更改,我必须从包含约1亿行的single trader表中获取行。下面的查询运行缓慢。我有两个索引,一个在t.name上,另一个在t.city&t.state上。从执行计划中,我看到正在使用t.name,但查询正在对t.amount、t.price、t.city和t.state进行索引ROWID扫描。从trader t中选择t.trader_id、t.name、t.city、t.state,其中t.name='john test'且有效=1和((t.amount介于(-2500.0000,2800.000)之间,t.price介于(25.00000,58.000000)之间)或(t.city='city'和t.state='state'))@user12121:有多少交易记录具有名称
'john test'
?你的新查询需要多长时间?我的要求。已更改,我必须从包含约1亿行的single trader表中获取行。下面的查询运行缓慢。我有两个索引,一个在t.name上,另一个在t.city&t.state上。从执行计划中,我看到正在使用t.name,但查询正在对t.amount、t.price、t.city和t.state进行索引ROWID扫描。从trader t中选择t.trader_id、t.name、t.city、t.state,其中t.name='john test'且有效=1和((t.amount介于(-2500.0000,2800.000)之间,t.price介于(25.00000,58.000000)之间)或(t.city='city'和t.state='state'))@user12121:有多少交易记录具有名称
'john test'
?您的新查询需要多长时间?