SQL Server表索引有一種使自己稀疏的特性,表越大並且訪問越頻繁,就越需要一個合適的調整因子。
SQL Server表索引的填滿因數選項是最常見的針對索引的一種調優方法。索引的填滿因數是一個百分比,用於告訴SQL Server每個葉級索引頁可以填充多少索引資料,多少空間應該保留作為成長空間。如果基礎資料表的列被修改或列被添加或在表中添加資料時,那麼就會發生擴充。隨著時間的推移索引片段在增長,或者索引效能表現不佳,這是一個標誌你可能需要調整最常用表的索引填滿因數。問題是如何進行調整。
首先,你必須做的是避免發生這類狀況,手動設定一個執行個體級的填滿因數,也就是說填滿因數將影響給定SQL Server執行個體中的所有表。原因很簡單:每張SQL Server表都有自己的操作特性,有其自身的需要。填滿因數預設設定為100% 。預設情況下,它可以隨時間調整就像調整資料庫效能一樣。
第二件要記住的事情:有可能在很多執行個體中不需要調整填滿因數。對只有幾頁的索引不必費心(使用DBCC SHOWCONTIG命令可知),反正這些索引都會被緩衝起來。首先確認索引的最大頁數和低掃描密度(使用DBCC SHOWCONTIG命令可知)。一個只有12頁和50%密度的索引所產生的問題要遠遠小於一個有7000頁和同樣密度的索引。
第三,要明確需要調整多大,應該向什麼方向調整,因為沒有一個神奇數字可以滿足所有的需求。填滿因數設定太高,就會浪費大量的空間以及被拆分成單頁。填滿因數設定太低,資料庫大小的增加會導致大量的輸入/輸出操作從而影響效能。
Randal建議開始的時候把70%作為預設值使用一個星期左右,然後根據變化的結果向上或向下調整這個值。在這方面SQL Server效能計數器(sys.dm_os_performance_counters)Page Splits/sec就是一個很大的協助;計數器值越高,越需要對SQL Server表索引進行調優。
也有人建議,填滿因數的設定取決於有問題表的讀/寫率,低更新(頻繁讀)的表使用高填滿因數,反之亦然。因此,填滿因數值不應低於60%-70%,除非你有一些極不尋常的使用方式情節,一般情況下都是寫的數量級多於讀。
另一個建議是:如果只是將資料添加到表的末尾,那麼填滿因數不能設定為0或100%。根據我的經驗,追加方式操作的表通常受益於90%的填滿因數,如果沒有大量的更新操作,只需要空出足夠的索引成長空間即可。
SQLTeam.com的Tara Kizer也談到填滿因數的更改如何會降低SELECT的效能,以及任何更改填滿因數的動作必須要有週期性資料庫效能審計。