2009-06-30 33 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)

相關問題