Oracle上下文索引 - 它是如何工作的?

时间:2016-03-08 14:35:04

标签: oracle

我在Oracle中有一个带有表的数据库,它拥有大约700,000行。 现在我为要搜索的列(First,Last和Other_Names)设置了索引(Context)。 如果我运行下面的声明,大约需要45秒。 但是,如果我将OR更改为AND,那么它只需要0.187秒。 那么这里发生了什么? 我怎么解决它(我需要或运营商) THX

SELECT score(1),FIRST_NAME,LAST_NAME,OTHER_NAMES 
FROM VIEW_NAMEN 
WHERE (CONTAINS(LAST_NAME,'Merkel',0) > 0 
  AND CONTAINS(FIRST_NAME,'Angela',1) >0) 
   OR (CONTAINS(OTHER_NAMES,'%Angela% AND %Merkel%',2)>0) ;

1 个答案:

答案 0 :(得分:0)

首先,在使用AND和OR时应使用括号,以确保它们按预期执行。您的WHERE子句等同于:

WHERE ( CONTAINS(LAST_NAME,'Merkel',0) > 0 
       AND CONTAINS(FIRST_NAME,'Angela',1) >0 )
   OR (CONTAINS(OTHER_NAMES,'%Angela% AND %Merkel%',2)>0) 

哪些可能是您想要的,也可能不是。

我的猜测是,最终条件CONTAINS(OTHER_NAMES,'%Angela% AND %Merkel%',2)>0的处理速度比其他两个要慢得多(它更复杂)。

当您将OR更改为AND(因此不需要括号)时,首先查询将查找其姓氏包含' Merkel'的人。也许只有几百个。然后它过滤那些500(比方说)名字包含' Angela'。也许只有10个。最后,它应用other_names条件,仅适用于那10行。如果该条件每行需要0.00006秒进行评估,则需要0.00006 * 10 = 0.0006秒。

但是使用OR,你现在正在寻找姓Merkel的人,名字是Angela OR,其他名字包含Angela和Merkel。因此,最后一个条件必须检查所有名字和姓氏不是 Angela Merkel的人,即近700,000人。这需要大约700,000 * 0.00006 = 42秒。

好的,可能会发生什么。至于如何CONTAINS(OTHER_NAMES,'%Angela% AND %Merkel%',2)>0走得更快,我怕我不知道!