简述问题
首先生产上的一张十几亿量级的表,根据REQUEST_TIME 查询,时间较长,因此当时造了几千万数据,加一个时间字符串字段(带索引),sql执行的效率大大提高了。
问题:生产上使用该sql,查询一个小时一直没有查询成功。
使用不带索引的虽然慢,二十分钟就查询出来了。
结合执行计划定位具体原因:
原SQL查询:
explain plan for
SELECT COUNT(*) FROM 大表 WHERE REQUEST_TIME >= to_date('2000-07-01','yyyy-MM-dd') and SEND_STATUS = 'OK';
SELECT * from table(dbms_xplan.display);
生产库的执行计划:
通过加索引字段查询:
explain plan for
SELECT COUNT(*) FROM 大表 WHERE ACCT_DATE >= '20000701' and SEND_STATUS = '04';
SELECT * from table(dbms_xplan.display);
生产库的执行计划:
在生产上查看执行计划才发现,如果使用索引第一次查询到的结果行数过多,导致数据库在第一步通过索引查询时,需要放到缓存中的数据过大。
总结:
1、使用索引,很多时候是会将查询变快,但是数据量很大的时候,一定要在生产表上查看执行计划,确保万一,再确定方案。
2、解决办法:目前我们是提了分库分表的方案,来彻底解决。临时办法就是给data类型的请求时间加上索引,再缩小查询的时间范围。