分区表上的索引不会使用 where 子句中的函数提高性能



我有此查询

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 )
;

查询非常慢,当我解释计划时,它表明索引不使用,但使用了全表扫描,如果我删除

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

实际上没有匹配,这就是为什么未使用该索引来执行完整扫描的原因...但是当有匹配项时,使用索引

最新更新