合併類似的索引?
在瀏覽我們的一些數據庫時,過去我們可能有點急於從 DTA 或估計的查詢計劃中獲得任何建議,因此我們有很多索引,其中許多與其他索引相似。“相似”是指它們具有相同的鍵,但包含不同或重疊。以下是我將描述為“相似”的 3 個索引的一些範例:
CREATE INDEX Index1 ON Table1 (Col1)
CREATE INDEX Index2 ON Table1 (Col1) INCLUDES (Col2)
CREATE INDEX Index3 ON Table1 (Col1) INCLUDES (Col3)
我的期望是,將這 3 個索引合併為 1 個索引(即 .
CREATE INDEX Index4 ON Table1 (Col1) INCLUDES (Col2, Col3)
)可以清理並改進表上的插入/更新/刪除,而不會損害查詢性能。那準確嗎?有沒有比刪除現有的類似索引然後創建新索引更好或更有效的方法來解決這個問題?謝謝!
重疊索引的合併通常是一種很好的做法。
- 由於每次插入的索引寫入更少,您將看到插入性能有所提高。
- 刪除會更快,因為需要刪除的索引更少。
- 在大多數情況下,更新也會更快,具體取決於要更新的列。
- 由於更少的數據複製,您消耗的磁碟空間更少。
僅這些點就可能有助於提高表的性能,因為這些鎖的持有時間較短。較短鎖的副作用也可能導致對錶的選擇性能提高,因為它們可能不太可能遇到鎖。
此外,包含列的順序對性能沒有影響,因為這些列未在索引中排序。換句話說,嘗試從 col3 是第一個包含列的索引讀取 col3 的查詢將執行與從它是第二個包含列的索引讀取相同的操作。
在您提供的範例中,Index4 可能是用於合併最初 3 個索引的最佳索引。
合併索引前需要考慮的其他事項
- 當您向索引添加更多列時,您確實會增加索引的大小,從而可能導致從索引中讀取速度變慢。
- 查看要合併的列的數據類型。
- 針對錶和受影響的索引查看讀/寫模式。
- 在更改前後查看查詢計劃。
例如,如果索引 A 可以從每分鐘 1,000 次讀取並且具有很少的小列,例如 varchar(20)。索引 B 可以在報告期間每月讀取一次,並且具有數據類型為 varchar(2000) 的列。在這種情況下,合併可能會對正常生產查詢期間的整體性能產生負面影響,而對月度報告工作幾乎沒有好處。
話雖如此,指數整合在大多數情況下仍然有意義。但這只是一個指導方針,而不是規則。在做出最終決定之前,您需要審查所有因素,並確定在這種情況下您的目標是什麼。Brent Ozar 經常建議每個索引不超過 5 列,每個表不超過 5 個索引。Ronaldo實際上鍊接到Brent Ozer關於SQL Server 索引調整技巧的評論中的一篇好文章:辨識重疊