我们刚刚将SQL Server 2005升级到SQL Server 2008 R2,并发现了一些性能问题。 下面的查询已经很慢,但现在在2008年,它只是超时了。我们重建目录以确保其在2008年新制作
DECLARE @FREETEXT varchar(255)='TEN-T'
select Distinct ...
from
DOSSIER_VERSION
inner join
DOSSIER_VERSION_LOCALISED ...
where
CONTAINS(DOSSIER_VERSION.*,@FREETEXT)
or
CONTAINS(DOSSIER_VERSION_LOCALISED.*,@FREETEXT)
如果您同时启用了这两个条件,则查询将分钟。
如果您只是将以下内容放在
中CONTAINS(DOSSIER_VERSION。*,@ FREETEXT)
它超级快。如果只是
,情况也是如此CONTAINS(DOSSIER_VERSION_LOCALISED。*,@ FREETEXT)
由于我们正在测试结果,我希望此查询的运行时间小于总和,但如上所述,它需要几分钟/几次。
谁能告诉我这里发生了什么?如果我使用一个union(它在概念上与or相同),性能问题就消失了,但我想知道我在这里遇到了什么问题,因为我想避免重写查询。
问候,汤姆
答案 0 :(得分:1)
请参阅我对这些非常相似的问题的答案:
基本思想是使用LEFT JOIN到CONTAINSTABLE(或FREETEXTTABLE)比在WHERE子句中将多个CONTAINS(或FREETEXT)ORed一起表现要好得多。