暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【Oracle】性能优化 —— 为何不走索引

testDemo 2018-03-18
2235


阅读前须知:

数据库: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)


不走索引大致可以分为以下几种情况:

  1. 索引字段 加了函数 不走索引 ;

    select * from flow_task ft where substr(ft.endtime,0,2) ='1';


  2. 索引字段 使用 is not null 、 is null 、<>、!=、> 、<  ;

    select * from flow_task ft where ft.endtime >'111' ;


  3. 索引字段 使用like '%T' ,not like '%T'   [注意前%一定要带上,其他情况可以正常走索引的] ;

    select * from flow_task ft where ft.endtime not like '%2018' ;


  4. 索引字段 数据类型不一致 导致不走索引 ;


    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类。


  5. 表小,Oracle优化器认为全表扫效率优于走索引。




总结,对于Oracle不走索引大致分为这几种,也是平时工作中常见的。写业务逻辑前可以先看一下sql的执行计划,可以避免之后的一些不必要的麻烦。对于上面提到的  “A. 索引字段 加了函数 不走索引 ”这种情况,如果必须要用函数,也可以加 函数索引


虽然索引可以显著提升查询性能,但是它们会降低 insert 、delete 、update 与merge 这一类DML的性能。所以,在表中有用不到的索引可以drop,不必要的索引会给DML带来不必要的性能损耗。




文章转载自testDemo,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论