2010-12-22 101 views
1

我在Sql Server 2008中玩了一點全文索引。我創建了索引,目錄並填充了它。 我的表有近400,000條記錄。我的全文索引被定義爲一個varchar(Max)列(讓我們現在稱它爲Text)。我正在執行以下查詢:Sql Server 2008全文優化

select * from MyTable where contains(Text,'house')。

該查詢在14秒內返回近20,000條記錄。我認爲這很慢。但是,當我執行這個查詢:從MyTable的

SELECT COUNT(*),其中包含(文字, '房子')

它僅需1秒鐘顯示結果。

我一直在尋找,並且據我所見,這兩個查詢的執行計劃是相同的。 爲什麼Sql Server花費太多時間來顯示第一個查詢結果?

我已經做了:

我買了一個SSD,並把兩者MDF和LDF該磁盤上。但是,當我執行第一個查詢時,我可以看到日誌和tmp數據庫正在我的硬盤(不在SSD中)創建。我的SSD是D:並且所有臨時文件都在C:上創建。

這是否需要這麼久,因爲sql需要這些文件來填充企業管理器結果網格?有什麼我可以做的優化數據庫?我真的需要查詢在不到2秒的時間內運行。

+0

一切正在一臺機器上完成,還是通過網絡傳輸數據? – 2010-12-22 23:16:29

+0

還有一個問題:那14秒鐘的數字是完成將結果集返回給SSMS窗口所需的時間,還是開始顯示值的時間? – 2010-12-22 23:18:00

+0

完成將結果集返回給我的SSMS所需的時間 – 2010-12-22 23:41:15

回答

2

您是否真的需要顯示所有文本,還是想對結果運行更多查詢並進一步縮小範圍?我假設大部分時間用於顯示結果 - 如果您不需要顯示它們或只想顯示這些結果的某個子集,則執行時間應該減少。

1

你有什麼理由需要返回20,000條記錄嗎?你能否將分頁添加到查詢中,以便返回20,100,1000或小於20,000的數據塊的結果集?無論您進行多少優化,都需要一段時間才能返回結果集。

1

您的查詢的額外時間可能來自Management Studio中的網格填充。

請記住,當您執行SELECT *時,您還在網格結果中包含文本列本身。嘗試僅選擇除「文本」列以外的列,並且您可能會看到執行時間更接近您的SELECT COUNT(*)查詢的執行時間。您可能還想在選擇列表中包含DATALENGTH(文本)。

Management Studio中還有一個選項,用於控制檢索到網格中的最大字符數。您可以在工具 - >選項 - >查詢結果 - >網格結果下找到它。

0

我同意基督教。你的問題在於結果的渲染。嘗試輸出到文本而不是網格來消除這些開銷。