oracle没有使用已定义的索引

时间:2014-11-06 15:40:42

标签: oracle hint sql-execution-plan oracle-text

如下所示,我的表A和B之间有一个简单的连接。 此外,每个表上都有一个与Or运算符组合的条件。

SELECT /*+ NO_EXPAND */
   * FROM  IIndustrialCaseHistory B ,
           IIndustrialCaseProduct A 
     where (
                                  A.ProductId  IN ('9_2') OR
                                  contains(B.KeyWords,'%some text goes here%' ) <=0

           )
       and ( B.Id = A.IIndustrialCaseHistoryId)

在ProductId上定义了一个b-tree索引,而对于KeyWords,则有一个函数索引。 但我不知道为什么我的执行计划不使用这些索引并执行完全表访问? 正如我在this中找到的那样,URL NO_EXPAND优化提示可能会使用执行计划中的索引(NO_EXPAND提示会阻止基于成本的优化程序在WHERE子句中考虑具有OR条件或IN列表的查询的OR扩展)。但我没有看到任何使用已定义的索引

我的查询是什么问题?!

1 个答案:

答案 0 :(得分:0)

除非有一些我不知道的contains()函数有些神奇,否则Oracle不能使用索引来查找带有通配符的匹配值,即varchar2列中的文本字符串值但不能启动在该值的第一个位置。 [或B.KeyWords LIKE'%一些文本在这里%' - 而不是 - 或者B.KeyWords LIKE'一些文本从这里开始%' - 可通过索引优化。]优化器将默认返回到全表扫描在这种情况下。 此外,虽然它可能不重要,但如果列表中只有一个值,为什么要使用IN()?为什么不A.ProductId ='9_2'?