美文网首页
oracle走索引查询变慢

oracle走索引查询变慢

作者: 要不再等等 | 来源:发表于2019-07-31 16:19 被阅读0次

在做交易系统时,遇到一个场景,需要查询交易表的某个时段的交易,但是时段间交易数据过大,导致查询时间太长,达到25小时还在进行,最后只能kill。
sql:

SELECT * FROM (
            SELECT ROWNUM AS rowno FROM (
                SELECT * FROM t_txn
                   WHERE
                       and txn_type != '1' and txn_type != '2'
                       and merchant_id = '123' 
                           and terminal_id = '234'
                   and txn_time BETWEEN sysdate - 30 and sysdate
                   ORDER BY txn_time DESC         
        ) t WHERE ROWNUM <= 10) tt 
WHERE tt.rowno > 1

t_txn为交易表,merchant_id表示商户号,terminal_id表示终端号,txn_time表示交易时间,同时txn_time有索引。

研究分析,问题就出在txn_time上,如果走索引会非常慢,反而不走索引(/+no_index(t)/)速度反而很快。

原理分析:
使用索引查一条数据,需要先访问索引的数据,然后再访问表的数据,两次读操作
如果全表扫描,只访问表的数据,一次读操作
所以,如果查询结果占到表数据的50%以上,使用索引必然慢
再考虑到一次读操作可以读多条数据,索引的结构又比表复杂
可能查询结果占到表数据的一定比例以上,使用索引就不如全表扫描了

相关文章

网友评论

      本文标题:oracle走索引查询变慢

      本文链接:https://www.haomeiwen.com/subject/edmgkctx.html