1

如下所示,我的表 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 有一个函数索引。但我不知道为什么我的执行计划不使用这些索引并执行完整的表访问?正如我在URL 中发现的那样,NO_EXPAND 优化提示可能会在执行计划中使用索引(NO_EXPAND 提示可防止基于成本的优化器考虑对 WHERE 子句中具有 OR 条件或 IN 列表的查询进行 OR 扩展)。但我没有看到定义索引的任何用途

我的查询有什么 oracle 问题?!

4

1 回答 1

0

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

于 2014-11-06T23:05:20.687 回答