Oracle索引被抑制情况

2014-11-24 17:21:02 · 作者: · 浏览: 0

测试环境的说明:



情况一、TO_CHAR和TO_DATE的使用


以下两条语句实现的功能都是一样的,但是两条的执行计划是不一样的,有一条会走索引,还有一条不走索引:


select count(*) From JOHN WHERE LASTRUNTIME>TO_DATE('2014-03-05 11:00:00','yyyy-MM-dd HH24:mi:ss');


select count(*) From JOHN WHERE TO_CHAR(LASTRUNTIME,'yyyy/MM/dd HH24:mi:ss')>'2014-03-05 11:00:00';





原因:JOHN_TIME索引记录的是DATA的值,而不是to_char后的值,所以语句一会走索引,语句二走全表扫描;



情况二、在条件中使用表达式


select count(*) From JOHN WHERE LASTRUNTIME>SYSDATE-100;


select count(*) From JOHN WHERE LASTRUNTIME-100>SYSDATE;





原因:JOHN_TIME索引记录的是DATA的值,而不是DATA-100后的值;


总结:1、不要轻易在字段前增加函授;


2、尽量不要将字段嵌入到表达式中;


总而言之:就是有索引的那列不能进行任何的相关操作,单独的放在等式的一边;