(一)索引失效的原因分析:
- <>或者单独的>,<,(有时会用到,有时不会)
- 有时间范围查询;oracle 时间条件值范围越大就不走索引
- like "%_" 百分号在前.
- 表没分析(统计信息最好定期收集,以业务的不同确定不同的收集周期,在新增的索引有可能没有收集 ,那么就会导致索引失效)
解决方法:
分析方法有一下几种:
analyze table t1 compute statistics fortable; --针对表收集信息
analyze table t2 compute statistics for allcolumns; --针对表字段收集信息
analyze table t3 compute statistics for all indexescolumns; --收集索引字段信息
analyze table t4 computestatistics; --收集表,表字段,索引信息
analyze table t5 compute statistics for allindexes; --收集索引信息
analyze table t6 compute statistics for table for all indexesfor allcolumns; --
--收集表,索引,表字段信息
- 单独引用复合索引里非第一位置的索引列.
- 字符型字段为数字时在where条件里不添加引号.
- 对索引列进行运算.需要建立函数索引.
- not in ,not exist.
- 当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。
- 索引失效。
- 基于cost成本分析(Oracle因为走全表成本会更小):查询小表,或者返回值大概在10%以上;
解决办法:
在这种条件下 oracle会认为索引更占资源,就默认不走索引了。这种情况如果觉得索引快的,通过强制索引提高查询速度
select /*+INDEX(t IDEX_HZYB_JSJL_BDJSRQ)*/ from hzyb_jsjl t
where BDJSRQ >TO_DATE('','');