当查询中有多个CONTAINSTABLE时,SQL Server 2008全文搜索(FTS)非常慢

时间:2009-06-30 12:52:22

标签: sql-server sql-server-2008 full-text-search

在这种情况下,SQL Server 2008全文搜索(FTS)非常慢:

查询1:

SELECT [...] FROM ContentItem CI WHERE 
(**EXISTS** (SELECT TOP 1 * FROM **CONTAINSTABLE**([**Table1**], *, '"[search_string]*"') FT 
WHERE FT.[Key] = CI.ContentItem_Id)) 
ORDER BY [...]

结果:在SQL 2005和SQL 2008上超快

查询2:

SELECT [...] FROM ContentItem CI WHERE 
(**EXISTS** (SELECT TOP 1 * FROM **CONTAINSTABLE**([**Table2**], *, '"[search_string]*"') FT 
WHERE FT.[Key] = CI.ContentItem_Id)) 
ORDER BY [...]

结果:在SQL 2005和SQL 2008上超快

查询3:

SELECT [...] FROM ContentItem CI WHERE 
(**EXISTS** (SELECT TOP 1 * FROM **CONTAINSTABLE**([**Table1**], *, '"[search_string]*"') FT 
WHERE FT.[Key] = CI.ContentItem_Id) 
**OR EXISTS** (SELECT TOP 1 * FROM **CONTAINSTABLE**([**Table2**], *, '"[search_string]*"') FT 
WHERE FT.[Key] = CI.ContentItem_Id)) 
ORDER BY [...]

结果:在SQL 2005上超级快(大约一秒),但在SQL 2008上非常慢(3分钟+)

我知道SQL 2008 FTS的性能问题(即使在stackoverflow上),但还没有找到任何合理的解决方案。

3 个答案:

答案 0 :(得分:2)

您可以将查询3重写为

SELECT ... WHERE EXISTS ... CONTAINSTABLE(Table1...)
UNION
SELECT ... WHERE EXISTS ... CONTAINSTABLE(Table2...)
ORDER BY ...

UNION ALL可能比UNION快,但可能导致重复记录。

答案 1 :(得分:1)

你可能会得到一个糟糕的计划。如果您可以发布计划,它将有助于诊断问题。如果选择了错误的连接,您可以使用查询提示来解决问题。

答案 2 :(得分:0)

我们刚刚升级到SQL 2008并遇到了这个问题。我发现如果我把它放在查询的底部,它对我很有用:OPTION(MAXDOP 1)