深入理解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