我们遇到了一个问题,我们希望Stack Overflow的好心人能帮我们解决。我们正在运行SQL Server2008 R2,并且遇到了一个查询问题,该查询需要很长时间才能在大约100000行的中等数据集上运行。我们使用CONTAINS来搜索xml文件,并在另一列上搜索LIKE,以支持前导通配符。
我们用下面的小查询重现了这个问题,这个小查询大约需要35秒才能运行:
SELECT something FROM table1
WHERE (CONTAINS(TextColumn, '"WhatEver"') OR
DescriptionColumn LIKE '%WhatEver%')查询计划:

如果我们将上面的查询修改为使用UNION,运行时间将从35秒下降到<1秒。我们希望避免使用这种方法来解决问题。
SELECT something FROM table1 WHERE (CONTAINS(TextColumn, '"WhatEver"')
UNION
(SELECT something FROM table1 WHERE (DescriptionColumn LIKE '%WhatEver%'))查询计划:

我们使用CONTAINS来搜索的列是一个类型为image的列,它由大小在1k到20k之间的xml文件组成。
我们没有很好的理论来解释为什么第一个查询这么慢,所以我们希望这里的一些人能对这个问题有一些明智的看法。据我们所知,查询计划并没有显示任何异常情况。我们还重建了索引和统计信息。
有什么明显的地方是我们忽视的吗?
提前感谢您的宝贵时间!
发布于 2012-03-30 20:35:31
你们有没有试过:
SELECT *
FROM table
WHERE CONTAINS((column1, column2, column3), '"*keyword*"') 而不是这样:
SELECT *
FROM table
WHERE CONTAINS(column1, '"*keyword*"')
OR CONTAINS(column2, '"*keyword*"')
OR CONTAINS(column3y, '"*keyword*"') 第一个要快得多。
发布于 2013-06-14 23:20:45
我就是碰到了这个。据报道,这是SQL server 2008 R2上的一个错误:
http://www.arcomit.co.uk/support/kb.aspx?kbid=000060
他们在那篇文章中推荐使用包含两个selects的UNION而不是OR的方法。
https://stackoverflow.com/questions/6534322
复制相似问题