2013-02-19 52 views
0

我有一個查詢在多個表上執行連接。我在表的外鍵和主鍵上的聚簇索引上有非聚簇索引。在分析查詢計劃時,我發現查詢優化器正在所有表上選擇聚簇索引掃描,或者在某些情況下,將非聚簇索引掃描和鍵查找組合在一起以獲取其他非鍵列。爲了解決這個問題,我在非聚集索引中包含了(覆蓋)此查詢中所需的非鍵列。因此,我可以看到非聚集索引搜索/掃描按預期執行。涵蓋索引的用處

現在我的問題是,如果我有其他查詢需要許多其他非鍵列是結果集的一部分,那麼我可能會最終將所有列添加(INCLUDING)到非聚集索引來改善所有查詢的性能。這是個好主意嗎?

謝謝。

回答

1

它非常瞭解您的使用情況。爲所有可能查詢的內容添加索引是非常容易的,但與其他所有內容的折衷相比,這是非常容易的。每個索引都會花費你的時間和存儲 - 所以它可能會減慢你的插入/更新速度,而且你索引得越多,這個成本就越高。

如果您的使用非常有利於讀寫,那麼一切都很好,您只需支付一些存儲費用即可。如果你也需要體面的寫作表現,那麼你所能做的就是理解你的應用程序併爲你的最重要的東西編制索引。

我強烈推薦「內部sql server」系列叢書(Kalen Delaney et al) - 大量閱讀材料,但我保證他們會幫助您理解您所做的權衡。

0

這聽起來像你包含了你的WHERE子句所需的列,並且你得到了索引查找的結果。

您還可以包含在您的SELECT列表中的列,這會給您帶來不同的好處。如果您的索引包含查詢所需的所有字段(包括SELECT列表),那麼查詢結果可以直接從索引中返回,並且永遠不必返回表格記錄。

當然,UPDATE,INSERT和DELETE操作會包含索引構建的額外成本。

您可以運行SQL Server Management Studio工具> SQL Server事件探查器以獲取當前數據庫活動的示例。然後,您可以將其提供給工具>數據庫引擎優化顧問。如果您有很多INSERT和UPDATE活動,Tuning Advisor可能會建議刪除一些索引。如果您的活動主要是SELECT語句,則可能會建議其他索引。

我發現數據庫引擎優化顧問通常建議覆蓋多個列上的索引,如您所描述的。我有時會根據這個問題提出建議,但通常會將索引限制在關鍵字和條件列中,除非特定查詢存在特定的性能問題。