Oracle 中索引失效的情况

今天遇到了数据库查询语句的优化,遇到了索引失效的激烈讨论。

所以今天总结一下索引失效的一些情况

1.隐式转换导致索引失效。

    在日常开发中经常发生,以后要引以为戒

    表的字段tu_mdn定义为varchar2(200),但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效.

 错误的例子:select * from stu where sn=13333333333;

因为存在隐式的类型转换,所以索引失效

 正确的例子:select * from stu where sn='13333333333';


2. 对索引列进行运算导致索引失效。

  对索引列进行运算包括(+,-,*,/,! 等)

  错误的例子:select * from stu where id-1=9;

  正确的例子:select * from stu where id=10;


3. 使用Oracle内部函数导致索引失效。


       错误的例子:select * from stu where round(id)=10; 说明,此时id的索引已经不起作用了

       对于这样情况应当创建基于函数的索引.,create index test_id_fbi_idx on test(round(id));

      然后 select * from test where  round(id)=10; 这时函数索引起作用了


4. 以下使用会使索引失效,应避免使用;

 a. 使用 <> 、not in 、not exist、!=

 b. like "%_" 百分号在前(可采用在建立索引时用reverse(columnName)这种方法处理)

 c. 单独引用复合索引里非第一位置的索引列.应总是使用索引的第一个列,如果索引是建立在多个列上, 只有在它的第一个 列被where子句引用时,优化器才会选择使用该索引。

 d. 当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。


5. 不要将空的变量值直接与比较运算符(符号)比较。

   如果变量可能为空,应使用 IS NULL 或 IS NOT NULL 进行比较,或者使用 ISNULL 函数。


6. 不要在 SQL 代码中使用双引号。

  因为字符常量使用单引号。如果没有必要限定对象名称,可以使用(非 ANSI SQL 标准)括号将名称括起来。


7. 将索引所在表空间和数据所在表空间分别设于不同的磁盘chunk上,有助于提高索引查询的效率。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ORACLE自学教程 --create tabletestone ( id number, --序号usernam...
    落叶寂聊阅读 1,112评论 0 0
  • 作者 | 末来源 | https: //www.cnblogs.com/areyouready/p/780288...
    Java旅途阅读 335评论 0 0
  • SQL 优化(载录于:http://m.jb51.net/article/5051.htm) 作者: (一)深入浅...
    yuantao123434阅读 741评论 0 7
  • 本文主要总结了工作中一些常用的操作及不合理的操作,在对慢查询进行优化时收集的一些有用的资料和信息,本文适合有MyS...
    Chting阅读 613评论 0 1
  • 50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname...
    哈哈海阅读 1,248评论 0 7