我在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) ;
答案 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
走得更快,我怕我不知道!