阅读前须知:
数据库:Oracle 11g
工具:PL/SQL
创建表索引:create index indexName on tableName(column) tablespace space ;
删除表索引:drop index indexName ;
执行计划:是Oracle在对SQL做硬解析时的一个非常重要的步骤,它制定出了一个方案告诉Oracle在执行sql时以什么样的方式访问数据:索引还是全表扫描,是Hash Join 还是 Nested loops Join
在平时工作时,有时候会遇到,字段明明有索引,但查看执行计划时就没走索引,仍然全表扫。(以下sql中 字段endtime 加过索引,类型是varchar2)
不走索引大致可以分为以下几种情况:
索引字段 加了函数 不走索引 ;
select * from flow_task ft where substr(ft.endtime,0,2) ='1';
索引字段 使用 is not null 、 is null 、<>、!=、> 、< ;
select * from flow_task ft where ft.endtime >'111' ;
索引字段 使用like '%T' ,not like '%T' [注意前%一定要带上,其他情况可以正常走索引的] ;
select * from flow_task ft where ft.endtime not like '%2018' ;
索引字段 数据类型不一致 导致不走索引 ;
select * from flow_task ft where ft.endtime =1111 ; 这里的endtime 类型是varchar2,Oracle执行的时候相当于把endtime加了个函数转化了类型(隐式转化),效果等同于
select * from flow_task ft where to_number(ft.endtime) =111 ; 这种情况类似于A类。
表小,Oracle优化器认为全表扫效率优于走索引。
总结,对于Oracle不走索引大致分为这几种,也是平时工作中常见的。写业务逻辑前可以先看一下sql的执行计划,可以避免之后的一些不必要的麻烦。对于上面提到的 “A. 索引字段 加了函数 不走索引 ”这种情况,如果必须要用函数,也可以加 函数索引 。
虽然索引可以显著提升查询性能,但是它们会降低 insert 、delete 、update 与merge 这一类DML的性能。所以,在表中有用不到的索引可以drop,不必要的索引会给DML带来不必要的性能损耗。






