日期:2014-05-16  浏览次数:20407 次

oracle 索引失效的情况分析
?
1) 没有查询条件,或者查询条件没有建立索引?
2) 在查询条件上没有使用引导列?
3) 查询的数量是大表的大部分,应该是30%以上。?
4) 索引本身失效?
5) 查询条件使用函数在索引列上(见12)?
6) 对小表查询?
7) 提示不使用索引?
8) 统计数据不真实?
9) CBO计算走索引花费过大的情况。其实也包含了上面的情况,这里指的是表占有的block要比索引小。?
10)隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),?
但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效.?
错误的例子:select * from test where tu_mdn=13333333333;?
正确的例子:select * from test where tu_mdn='13333333333';?
11)对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等)?
错误的例子:select * from test where id-1=9;?
正确的例子:select * from test where id=10;?
12)使用Oracle内部函数导致索引失效.对于这样情况应当创建基于函数的索引.?
错误的例子:select * from test where round(id)=10;?
说明,此时id的索引已经不起作用了 正确的例子:首先建立函数索引,?
create index test_id_fbi_idx on test(round(id));?
然后 select * from test where round(id)=10; 这时函数索引起作用了 1,<> 2,单独的>,<,(有时会用到,有时不会)?
3,like "%_" 百分号在前.?
4,表没分析.?
5,单独引用复合索引里非第一位置的索引列.?
6,字符型字段为数字时在where条件里不添加引号.?
7,对索引列进行运算.需要建立函数索引.?