我有这个查询
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已分区
答案 0 :(得分:1)
一个明显的区别(不使用索引的原因)是<stream name="flatFileStream" format="fixedlength">
<record name="flatFileContents" class="com.test.YourPojo" order="1">
<field name="header" length="2" />
<field name="name" length="15" />
<field name="supplierCode" length="10" />
</record>
的结果是VARCHAR,而dbms_lob.substr( REPLACE(y.PK_DATA,'"',''), 100, 1 )
的结果是NUMBER
。< / p>
因此,如果可能,请使用3456
进行转换。
但你不会得到与to_number
相同的计划,因为这是不变的;原始查询使用3456
。
答案 1 :(得分:0)
实际上没有匹配,这就是为什么没有使用索引作为完整扫描的任何方式...但是当匹配时,使用索引