2009-06-30 31 views
1

SQL Server 2008的全文搜索(FTS)在这种情况下极其缓慢:SQL Server 2008的全文搜索(FTS)极其缓慢时,在一个以上的CONTAINSTABLE查询

查询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上),但还没有找到任何合理的解决方案。

回答

2

你可以重写查询3

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

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

1

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

0

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

相关问题