在做交易系统时,遇到一个场景,需要查询交易表的某个时段的交易,但是时段间交易数据过大,导致查询时间太长,达到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%以上,使用索引必然慢
再考虑到一次读操作可以读多条数据,索引的结构又比表复杂
可能查询结果占到表数据的一定比例以上,使用索引就不如全表扫描了
网友评论