Sql-Server

SQL Server 中的冗餘索引

  • March 9, 2019

我目前正在檢查我們數據倉庫中的所有索引作為性能調整練習。其中一些索引未在系統統計資訊中使用,我正在考慮刪除它們以減少批處理期間的成本。

其中一些沒有意義,因為在其他索引中間使用了 PK 列等。但是,我想知道 SQL Server 如何處理多列索引(具有重疊列)。

例子:

NONCLUSTERED INDEX Index1 (A, B, C)

NONCLUSTERED INDEX Index2 (A, B)

SQL Server 是否能夠將 Index1 用於與 Index2 相同的行,並且不需要 Index2?我知道 rowID 包含在 B+樹的葉級節點中,但是 C 的所有記錄在 Index1 中都是有效的。

可以在不影響性能的情況下刪除 Index2 嗎?

據我了解,索引還可以幫助執行計劃中的排序。Index1 也可以用於這些嗎?

一般來說,您應該能夠刪除 Index2 而不會出現任何重大問題。Index1 可以涵蓋 Index2 目前正在處理的任何查詢(假設兩者之間沒有任何包含的列差異)。

如果 Index1 中的 C 列很大,您最終可能會使用 Index1 將更多數據讀取到記憶體中,以用於可能使用 Index2 的查詢,因為第三列在每頁上佔用了更多空間,但在大多數情況下,我認為您不會會注意到性能上的任何明顯差異。

引用自:https://dba.stackexchange.com/questions/231643