【发布时间】:2011-06-30 11:54:17
【问题描述】:
我们遇到了一个问题,希望 Stack Overflow 的好心人能帮我们解决。我们正在运行 SQL Server 2008 R2,并且遇到了一个查询问题,该查询需要很长时间才能在中等数据集(大约 100000 行)上运行。我们使用 CONTAINS 来搜索 xml 文件并在另一列上使用 LIKE 来支持前导通配符。
我们通过以下运行大约 35 秒的小查询重现了该问题:
SELECT something FROM table1
WHERE (CONTAINS(TextColumn, '"WhatEver"') OR
DescriptionColumn LIKE '%WhatEver%')
查询计划:
如果我们将上面的查询修改为使用 UNION,运行时间会从 35 秒下降到
SELECT something FROM table1 WHERE (CONTAINS(TextColumn, '"WhatEver"')
UNION
(SELECT something FROM table1 WHERE (DescriptionColumn LIKE '%WhatEver%'))
查询计划:
我们使用 CONTAINS 搜索的列是类型为 image 的列,由大小在 1k 到 20k 之间的任何 xml 文件组成。
对于为什么第一个查询如此缓慢,我们没有好的理论,所以我们希望这里有人能就此事发表一些明智的看法。据我们所知,查询计划没有显示任何异常。我们还重建了索引和统计信息。
我们在这里忽略了什么明显的东西吗?
提前感谢您的宝贵时间!
【问题讨论】:
-
你试过改变where子句的顺序吗?
-
是的,我们已经尝试过了。性能方面没有可衡量的差异。
-
你能分别运行这两个查询吗?哪个更慢?
-
我们能看到两个查询计划吗?每个查询返回多少行?
-
这两个版本会产生不同的执行计划吗?
标签: sql performance sql-server-2008