Sql-Server

SQL Server - 重疊 NC 索引,放棄問題

  • March 26, 2021

我正在對 SQL ‘14 數據庫進行一些索引清理/調整,並在一個 6MM 行、16 個欄位表中執行,該表具有一個看起來不錯的聚集索引和兩個具有以下定義的非聚集、非唯一索引:

  • IX_1 開啟$$ Tbl1 $$($$ field1 $$)
  • IX_2 開啟$$ Tbl1 $$($$ field1 $$,$$ field2 $$) 包括 ($$ field3 $$,$$ field4 $$)

兩個索引的讀/寫數據顯示,IX_1 目前有 500 萬次搜尋/掃描,而 IX_2 有 10k 次搜尋/掃描,每個索引的更新都相同。我的索引調整感覺說不加思索就放棄 IX_1,因為它已被 IX_2 完全覆蓋。但是優化器對使用 IX_1 的強烈偏好讓我有點害怕。在這種情況下是否有任何理由三思而後行放棄 IX_1?謝謝。

當兩個索引都滿足一個查詢時,您會發現選擇了兩者中較小的一個。通常,這意味著更窄的索引,但它也適用於完全複製的、相同的索引,物理上更小的索引更受青睞。

除非您正在掃描索引並且完整大小很重要,否則您的索引調整 Spidey Sense 是正確的。刪除IX_1,您的查詢將使用IX_2. 那些尋求幾乎不會注意到。

如果您放棄IX_1,以前使用它的所有查詢現在都將開始使用IX_2. 隨著IX_2更大(一個關鍵欄位和兩個包含欄位),它具有:

  • 更多非葉級頁面支持第二鍵列
  • 更多的葉級頁面來儲存每行的 INCLUDE 列值

目前使用的任何查詢IX_1很可能不需要這些額外的欄位,否則它們已經在使用IX_2. 離開後,他們將IX_1不得不讀取更多數據才能生成相同的結果集。

根據數據類型,單列索引IX_1對寫入工作負載的影響通常非常低。我看不出有任何令人信服的理由放棄它。

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