您假设这个简单的查询:
select name, code
from item
where length(code) > 5
由于要避免对表的完全访问,通过以下命令在长度(代码)上有一个功能索引:
create index index_len_code on item(length(code));
优化器检测到索引并使用它(INDEX RANGE SCAN)。尽管如此,优化器仍无法为以下查询检测到以上索引:
select i.name, i.code
from item i, item ii
where length(i.code) - length(ii.code) > 0
当我看到执行计划时,它是访问全表,而不是在长度(代码)上存在索引时不进行索引范围扫描。
哪里错了,哪里错了?
答案 0 :(得分:4)
如果您有一个带有列EMP
的{{1}}表,并且该列已建立索引,那么优化程序可以选择使用索引来访问条件类似的查询中的表>
HIREDATE
查找最近12个月内雇用的员工。
但是,... HIREDATE >= ADD_MONTHS(SYSDATE, -12)
必须在左侧单独。如果您向其中添加或减去数月或数日,或者将其包装在HIREDATE
之类的函数调用中,则无法使用索引。优化程序不会执行简单的算术运算来将条件转换为ADD_MONTHS
本身必须满足不等式的条件。
第二个查询中也发生了同样的情况。如果您将条件更改为
HIREDATE
然后,优化器可以在... length(i.code) > length(ii.code)
上使用基于函数的索引。但是即使在第一个查询中,如果您将条件更改为
length(code)
将不使用索引,因为这不是... length(code) - 5 > 0
上的不等式。再说一次,优化器不够聪明,无法执行琐碎的代数运算,以某种形式将其重写为length(code)
本身的不等式条件。