涉及CONTAINS和OR的慢速SQL查询

Til*_*dig 10 sql performance sql-server-2008

我们遇到了一个问题,我们希望Stack Overflow的优秀人员可以帮助我们.我们正在运行SQL Server 2008 R2,并且在查询时遇到问题需要很长时间才能在一组中等数据上运行,大约有100000行.我们使用CONTAINS搜索xml文件,并在另一列上使用LIKE来支持领先的通配符.

我们使用以下小型查询重现了该问题,该查询大约需要35秒才能运行:

SELECT something FROM table1 
WHERE (CONTAINS(TextColumn, '"WhatEver"') OR  
        DescriptionColumn LIKE '%WhatEver%')
Run Code Online (Sandbox Code Playgroud)

查询计划:

慢查询

如果我们将上面的查询修改为使用UNION,则运行时间从35秒下降到<1秒.我们希望避免使用这种方法来解决问题.

SELECT something FROM table1 WHERE (CONTAINS(TextColumn, '"WhatEver"') 
UNION
(SELECT something FROM table1 WHERE (DescriptionColumn LIKE '%WhatEver%'))
Run Code Online (Sandbox Code Playgroud)

查询计划:

快速查询

我们使用CONTAINS进行搜索的列是一个类型为image的列,由大小为1k到20k的xml文件组成.

我们没有很好的理论为什么第一个查询是如此缓慢,所以我们希望有人在这个问题上有明智的说法.据我们所知,查询计划并没有显示任何异常.我们还重建了索引和统计数据.

有什么明显的东西我们在这里俯瞰吗?

在此先感谢您的时间!

Jus*_*tin 4

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

CONTAINS显然是一个全文谓词,并且将使用 SQL Server 全文引擎来过滤搜索结果,但是它LIKE是一个“普通”SQL Server 关键字,因此 SQL Server 将不会使用全文引擎来协助此查询 -在这种情况下,因为该LIKE术语以通配符开头,所以 SQL Server 将无法使用任何索引来帮助查询,这很可能会导致表扫描和/或性能比使用全文引擎差。

如果没有执行计划,很难说清楚,但是我对发生的事情的猜测是:

  • UNION查询的变体是执行表扫描-table1表扫描速度并不快,但由于表中的行相对较少,因此执行速度并不(与 35 秒基准相比)。

  • 在查询的变体中,SQL Server首先使用OR全文引擎根据严重低估了行数(某些类型的谓词可能会发生这种情况),因此继续执行数千次 RDI 查找,最终速度非常慢(表扫​​描会快得多)。CONTAINSLIKE

要真正了解正在发生的情况,您需要获取查询计划。