2010-11-02 99 views
1

我使用asp.net與SQL Server 2008 SP2SQL Server 2008全文搜索 - 慢SLI

我有一個表啓用全文搜索。

我的硬件是:2GHZ四核,4GB RAM,SAS硬盤。

該表具有圍繞5萬條記錄,其結構是:

Pages table: 

ID (INT) 
GroupID (INT) 
GroupStart (bit) 
Col1 varchar(900) 
Col2 nvarchar(450) 
Col3 nvarchar(450) 
Col4 nvarchar(450) 
Col5 nvarchar(450) 

我有在主鍵ID的FTS索引。

我使用下面的查詢搜索表:

SELECT * FROM ( 
SELECT * , ROW_NUMBER() OVER( ORDER BY KEY_TBL.Rank DESC ) AS RowNumber , COUNT(*) OVER() as TotalRows 
FROM Pages p 
INNER JOIN 
CONTAINSTABLE(Pages, *,N' FORMSOF (INFLECTIONAL, movies)') AS KEY_TBL 
ON p.ID = KEY_TBL.[KEY] 
WHERE (p.GroupID IS NULL OR p.GroupStart = 1) 
) LS 
WHERE RowNumber BETWEEN 0 AND 10 
ORDER BY RowNumber ASC; 

的查詢接受1S完成,如果總行約爲500

,並採取5S來完成,如果總行數約爲10,000。

並需要60s才能完成,如果總行數大約爲100,000。

任何想法爲什麼查詢需要這麼久?

在我的查詢,sql server中是否有問題或者是硬件問題?

+0

你有沒有看查詢計劃?什麼是最大的打擊?其他想法:如果您拿走COUNT(*)OVER()'會發生什麼情況;此外,CONTAINSTABLE只花了多長時間(使用ROW_NUMBER) - 我想知道連接是否很貴。很多變數 - 很難給出完整的答案... – 2010-11-02 13:41:26

+0

thx爲答案。我剛剛查過那個。刪除COUNT(*)OVER()會將60年代(100,000個結果)查詢刪除爲3秒! – RuSh 2010-11-02 13:44:08

+0

那麼接下來我會做什麼? count(*)over()佔用大部分時間,有什麼辦法可以改善它? – RuSh 2010-11-02 13:53:57

回答

1

全文搜索僅用於在varchar或文本字段中搜索文本,它不會加快查詢速度。你需要添加更多的索引到表中來做到這一點。

一般來說,查詢看起來過於複雜,但您尚未解釋查詢需要做什麼。我認爲查詢需要進行優化。

+0

查詢的目的是根據FTS(col1-col5)中具有GroupID IS NULL或GroupStart = 1的匹配從頁表中獲取分頁結果。哪種索引可以幫助提高速度? – RuSh 2010-11-04 17:15:50

+0

如果刪除count子句,查詢執行的速度有多快? ...如果是這樣,更新表的頻率如何?如果未更新,通常考慮在單獨的表中保留記錄計數,並在更新表時通過觸發器進行更新,或者如果您有單個更新源在更新時觸發SP中的計數。 – 2010-11-04 18:17:24

+0

其基於全文查詢的結果計數,你不能保持每個搜索查詢的計數。 – RuSh 2010-11-07 17:34:44

1

考慮限制由CONTAINSTABLE返回匹配的數量 - >CONTAINSTABLE(Pages, *,N' FORMSOF (INFLECTIONAL, movies)', 100)

+0

感謝您的答案,但那不是一個真正的解決方案,我需要獲得所有結果。 – RuSh 2010-11-07 17:33:29

+0

嗯,那就是我所害怕的。事實是,你不會從超過5百萬行的FT查詢中獲得任何合理的性能。你需要找到解決辦法。你能準確發佈這個查詢的要求嗎? IE瀏覽器。忽略FORMSOF並提供某種不同的搜索邏輯會是可以接受的嗎? – 2010-11-08 11:03:12