函数索引在与其他运算符一起使用的oracle中不起作用

时间:2018-09-06 14:24:49

标签: oracle indexing query-performance

您假设这个简单的查询:

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

当我看到执行计划时,它是访问全表,而不是在长度(代码)上存在索引时不进行索引范围扫描。

哪里错了,哪里错了?

1 个答案:

答案 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)本身的不等式条件。