分区 table 上的索引不会通过 where 子句中的函数提高性能

index on partitioned table doesn't enhance performance with a function in where clause

我有这个问题

select col1,col2, x.id pk 
/*+ INDEX (some_index_on_col4)*/
from tbl1 y
,tbl2 x
where col2 = 'some_value' and col3 = 'U'
and x.col4 = dbms_lob.substr( REPLACE(y.PK_DATA,'"',''), 100, 1 )
;

查询很慢,当我解释计划时,它显示没有使用索引而是使用完整的table扫描,如果我删除

dbms_lob.substr( REPLACE(y.PK_DATA,'"',''), 100, 1 )

然后说

x.col4 = 3456

它运行良好,我该如何增强它?

N.B。 : tbl2 已分区

一个明显的区别(也是 不使用索引 的常见原因)是 dbms_lob.substr( REPLACE(y.PK_DATA,'"',''), 100, 1 ) 的结果是 VARCHAR,而不是 NUMBER 作为 3456.

所以如果可能的话用 to_number 转换它。

但是您不会得到与 3456 相同的计划,因为这是不变的;原始查询使用 y.PK_DATA.

实际上没有匹配项,这就是为什么不使用索引的原因,因为以任何方式执行了完整扫描...但是当有匹配项时,就会使用索引