test1和test2的字段id1都有index,t.opd和s.crd也有index,但以下查询语句就是不走index,请问大家是什么原因?
SELECT t.*,
FROM test1 t,
test2 s
WHERE t.id1 = s.id1
AND t.opd IS NOT NULL
AND s.crd IS NOT NULL
AND t.no_change_opd IS NULL
AND t.opd <= s.crd
SELECT t.*,
FROM test1 t,
test2 s
WHERE t.id1 = s.id1
AND t.opd IS NOT NULL
AND s.crd IS NOT NULL
AND t.no_change_opd IS NULL
AND t.opd <= s.crd
并不是走索引的执行计划就是最好的执行计划。你可以通过hint强迫走id1索引,看看效果如何。
由于上面描述的原因,oracle不会因为你在谓词条件中给出了t.opd is not null之类的条件就走对应列上的索引,因为所有索引中的内容都符合opd is not null。oracle认为,如果走索引的话,其执行效率反而更差,因为需要对index执行全扫描之后再回表,可以想象大部分数据都满足条件。
AND t.opd IS NOT NULL
AND s.crd IS NOT NULL
这两个条件,
因为只要有一个为空t.opd <= s.crd就是false
另外可以列出执行计划和表的数据量情况