我有此查询
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
。
实际上没有匹配,这就是为什么未使用该索引来执行完整扫描的原因...但是当有匹配项时,使用索引