2011-06-30 91 views
10

我们遇到了一个问题,我们希望Stack Overflow的好人可以帮助我们。我们正在运行SQL Server 2008 R2,并且在查询中遇到问题,需要很长时间才能在适中的数据集(大约100000行)上运行。我们使用CONTAINS搜索XML文件,并在另一列上搜索以支持领先的通配符。涉及CONTAINS和OR的慢SQL查询

SELECT something FROM table1 
WHERE (CONTAINS(TextColumn, '"WhatEver"') OR 
     DescriptionColumn LIKE '%WhatEver%') 

查询计划:

我们已经与大约需要35秒运行下面的小查询问题再次出现,

Slow query

如果我们修改上面的查询使用UNION代替,运行时间从35秒降至< 1秒。我们希望避免使用这种方法来解决问题。

SELECT something FROM table1 WHERE (CONTAINS(TextColumn, '"WhatEver"') 
UNION 
(SELECT something FROM table1 WHERE (DescriptionColumn LIKE '%WhatEver%')) 

查询计划:

Fast query

我们使用的列包含通过搜索与类型图像的列,包括XML文件大小在任何地方从1K到大小为20K。

对于为什么第一个查询太慢,我们没有很好的理论,所以我们希望这里的某个人能够对此事有明智的说法。据我们所知,查询计划没有显示任何异常情况。我们还重建了索引和统计数据。

我们在这里忽略了什么明显的明显?

在此先感谢您的时间!

+0

您是否尝试过更改where子句的顺序? – idstam

+0

是的,我们已经试过了。表现没有可衡量的差异。 – Tilfeldig

+0

你可以单独运行这两个查询吗?哪个更慢? – niktrs

回答

4

为什么使用DescriptionColumn LIKE '%WhatEver%'而不是CONTAINS(DescriptionColumn, '"WhatEver"')

CONTAINS显然是一个全文谓词和将使用SQL Server全文引擎来过滤搜索结果,不过LIKE是一个“正常”的SQL Server关键字等SQL Server将不使用全文引擎使用此查询来执行此操作 - 在这种情况下,因为LIKE项以通配符开头,所以SQL Server将无法使用任何索引来帮助执行查询,这将最有可能导致表扫描和/或性能比使用“完全”文本引擎。

难以 不可能说没有执行计划,但是我对发生了什么的猜测是:

  • 查询的UNION变化对table1执行表扫描 - 表扫描但速度并不快,但是因为表格中相对较少的行,它不会执行那么慢(与35s基准相比)。

  • 在查询的SQL Server OR变化首先使用全文引擎基于所述CONTAINS过滤,然后前进到在结果上执行每个匹配行的RDI查找过滤器的基础上LIKE谓词,但是由于某些原因,SQL Server大量低估了行数(这可能会发生在某些类型的谓词中),因此继续执行几个thousnad RDI查找,结果令人难以置信的慢(表扫描会更快)。

为了真正了解发生了什么,需要获取查询计划。

+0

我们使用LIKE来搜索“DescriptionColumn”的原因是在搜索时允许引用通配符。我很抱歉在原始问题中没有提及这一点。查询计划已添加到原始帖子中。 – Tilfeldig

1

难道你们试试这个:

SELECT * 
FROM table 
WHERE CONTAINS((column1, column2, column3), '"*keyword*"') 

取而代之的是:

SELECT * 
FROM table 
WHERE CONTAINS(column1, '"*keyword*"') 
OR CONTAINS(column2, '"*keyword*"') 
OR CONTAINS(column3y, '"*keyword*"') 

第一个是快了很多。