【问题标题】:Oracle query performance with BETWEEN operator使用 BETWEEN 运算符的 Oracle 查询性能
【发布时间】:2013-05-28 18:06:02
【问题描述】:

我有一个大约有 1 亿行的表。必须使用 BETWEEN 运算符。我看到查询运行得很慢。

我在交易者表中添加了 2 个索引,第一个在 t.name 上,第二个索引是 t.amount 和 t.price。

查询执行速度非常慢。使用 BETWEEN 运算符时,对价格和金额进行索引是否有帮助。另外,我该如何优化呢?

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

【问题讨论】:

  • 您为什么要关注 BETWEEN?还有很多其他过滤器。
  • 您能提供您的查询的执行计划吗?
  • t.price IS NOT NULL, t.amount IS NOT NULL 没有用,因为你有 t.price BETWEEN (25.00000 , 58.000000) 和 t.amount BETWEEN (-2500.0000 , 2800.000) 对应
  • 不发布查询执行计划就问查询性能问题是没有意义的。
  • 您好,我注意到您已经有将近 40 分钟没有活动并且还没有回答一个问题。请记住,Stack Overflow 的移动速度快速。如果您想获得最佳答案,请始终在提问后的前 30 分钟到一个小时内停留,并准备好立即在 cmets 中回答问题。

标签: performance oracle query-optimization


【解决方案1】:

选择性是优化性能的关键 - 在 city_present.name 为“TEST_TEST”的城市/州,被称为“john test”且 is_valid = 1 的交易者可能比价格在 25 到 58 之间的交易者少得多和介于 -2500 和 2800 之间的金额。

因此,我建议在交易者表上设置索引,按名称、城市、州和 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

【讨论】:

  • 我的要求。已经改变,我必须从包含大约 1 亿行的单个交易者表中获取行。下面的查询运行缓慢。我有 2 个索引,一个在 t.name 上,另一个在 t.city 和 t.state 上。从执行计划中,我看到正在使用 t.name,但查询正在对 t.amount、t.price、t.city 和 t.state 进行 INDEX ROWID 扫描。 SELECT t.trader_id, t.name, t.city, t.state FROM trader t WHERE t.name = 'john test' AND is_valid = 1 AND ((t.amount BETWEEN (-2500.0000 , 2800.000) AND t.price 之间(25.00000 , 58.000000) ) OR (t.city='city' AND t.state='state' ))
  • @user12121:有多少交易者记录名称为'john test'?您的新查询需要多长时间?
猜你喜欢
  • 2020-11-06
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 2016-10-07
相关资源
最近更新 更多