深入理解Oracle索引(23):6 种常见不走索引的原因分析

      有时候、挺郁闷的、丫的、咋回事啊、就不走索引、
      如果、你发现不走索引、却莫冒失强加自己的意志、
      总得给出理由吧、做个测试先、证实/伪走索引切实明智
      否则、可能会返回错误的结果、也可能导致性能下降
      
      下面就常见不走索引的 6 种原因简要分析一下、做到心里有底
      
      
     
㈠ 违背复合索引"前缀性"原理
         
         谓词没有使用索引前导列
         
      
      ㈡ 隐式转换
         
         举个例子吧、假设我在字符列上建立个索引、然后:
         
         select * from t  where index_column = 8;
         
         这条语句实际上会被等价于:
         
         select * from t where to_number(index_column) = 8;
         
         一定要尽可能避免隐转、
         自己跟自己比就行了、"别人家的孩子"就让他们自己捣鼓去吧
         
         
      ㈢ 索引列被污染
         
         这个我之前的文章有写到、这里就不赘述
         如何避免索引列被污染
         
         第二点、从本质上而言、和三是一样的、都是索引列被污染
         
      
      ㈣ select count(*) from t;(或类似查询)
         
         记住了、索引中的行数并不总是等于基表的行数的、因为
         索引不存储全为NULL 的列
         
      
      ㈤ 25%
         
         25% 虽然是个经验值、但我更愿意这样叫
         当业务需要检索表中数据超过某个阀值、CBO 就认为、走索引没啥意义鸟
         
      
      ㈥ 有一段时间木有分析表了
         
         没有正确的统计信息、哪来的正确的执行计划呢?

         别偷懒哈、

 

 

By David Lin

2013-06-11

Good Luck

         

posted @ 2013-06-12 18:28  爱生活,爱编程  阅读(536)  评论(0编辑  收藏  举报