【发布时间】:2016-06-29 12:44:59
【问题描述】:
我有这个问题
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
它工作正常,我该如何增强它?
注意: tbl2 被分区
【问题讨论】:
-
您也可以按照here的描述发布两个查询的执行计划
-
当您将其更改为
x.col4 = 3456时,Oracle 知道只有一个 x.col4 感兴趣的值 (3456),因此可以清楚地使用索引。使用dbms_lob.substr( REPLACE(y.PK_DATA,'"',''), 100, 1 ),可能会选择许多不同的 x.col4 值 - 甚至可能是 all - 因此优化器可能会决定最好进行全扫描, -
实际上没有匹配,这就是为什么没有使用索引,因为以任何方式执行了全扫描......但是当有匹配时,使用索引
-
提示将出现在单词“select”之后
标签: database oracle sqlperformance database-indexes