分区表上的索引不会增强where子句中的函数的性能

时间:2016-06-29 12:44:59

标签: database oracle sqlperformance database-indexes

我有这个查询

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已分区

2 个答案:

答案 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)

实际上没有匹配,这就是为什么没有使用索引作为完整扫描的任何方式...但是当匹配时,使用索引