起因:接口传输数据慢,出现超时情况。
原因:表数据量庞大,执行查询操作时耗时久。虽然建立了索引,但是没有效果,没有走索引。
数据库:Oracle
查看执行计划结果:Sql语句是否走索引。
EXPLAIN PLAN FOR slow sql;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
注:EXPLAIN PLAN FOR 后接Sql语句。
结果:全表扫描检索。长时间没做表分析或者重新收集表状态信息,未走索引。
解决:分析表。
analyze table tablename compute statistics
总结一:常见索引扫描类型
index unique scan
索引唯一扫描,当可以优化器发现某个查询条件可以利用到主键、唯一键、具有外键约束的列,或者只是访问其中某行索引所在的数据的时候,优化器会选择这种扫描类型。
index range scan
索引范围扫描,当优化器发现在UNIQUE列上使用了大于、小于、大于等于、小于等于以及BETWEEN等就会使用范围扫描,在组合列上只使用部分进行查询,导致查询出多行数据。对非唯一的索引列上进行任何活动都会使用index range scan。
index full scan
全索引扫描,如果要查询的数据可以全部从索引中获取,则使用全索引扫描。
index fast full scan
索引快速扫描,扫描索引中的全部的数据块,与全索引扫描的方式基本上类似。两者之间的明显的区别是,索引快速扫描对查询的数据不进行排序,数据返回的时候不是排序的。“在这种存取方法中,可以使用多块读功能,也可以使用并行读入,从而得到最大的吞吐量和缩短执行时间”。
总结二:可能不走索引的情况
1、where 中字段没创建索引,不走索引。
2、长时间没做表分析或者重新收集表状态信息,不走索引。
3、索引列使用函数,需建立函数索引。
4、对索引列进行了加减乘除运算,不走索引。
5、where中使用 is null 和 is not null。
6、where中使用 like '%%' 进行模糊查询。
7、where中使用<>、not in 、not exist。
8、数据类型不匹配,例如:select * from tablewhere jlbh = 1;jlbh为varchar2类型字段
9、单独引用复合索引里非第一位置的索引列。
10、索引失效,可以考虑重建索引,rebuild online。