填滿因數
提供填滿因數選項是為了最佳化索引資料存放區和效能。當建立或重建索引時,填滿因數的值可確定每個葉級頁上要填充資料的空間百分比,以便在每一頁上保留一些剩餘空間作為以後擴充索引的可用空間。例如,指定填滿因數的值為 80 表示每個葉級頁上將有 20% 的空間保留為空白,以便隨著向基礎資料表中添加資料而為擴充索引提供空間。在索引行之間保留可用空間,而不是在索引的末尾保留。
填滿因數的值是 1 到 100 之間的百分比,伺服器範圍的預設值為 0,這表示將完全填充葉級頁。
注意: |
填滿因數的值 0 和 100 在所有方面都是相同的。 |
可以使用 CREATE INDEX 或 ALTER INDEX 語句來設定各個索引的填滿因數值。若要修改伺服器範圍的預設值,請使用 sp_configure 系統預存程序。若要查看一個或多個索引的填滿因數值,請使用 sys.indexes。
重要提示: |
只有在建立或重建了索引後,才會應用填滿因數設定。SQL Server 資料庫引擎並不會在頁中動態保持指定的可用空間百分比。如果試圖在資料頁上保持額外的空間,將有背於使用填滿因數的本意,因為隨著資料的輸入,資料庫引擎將不得不在每一頁上進行頁面分割,以保持填滿因數所指定的可用空間百分比。 |
效能注意事項
頁面分割
正確選擇填滿因數值可提供足夠的空間,以便隨著向基礎資料表中添加資料而擴充索引,從而降低頁面分割的可能性。如果向已滿的索引頁添加新行,資料庫引擎將把大約一半的行移到新頁中,以便為該新行騰出空間。這種重組稱為頁面分割。頁面分割可為新記錄騰出空間,但是執行頁面分割可能需要花費一定的時間,此操作會消耗大量資源。此外,它還可能造成片段,從而導致 I/O 操作增加。如果經常發生頁面分割,可通過使用新的或現有的填滿因數值來重建索引,從而重新分發資料。有關詳細資料,請參閱重新組織和重建索引。
雖然採用較小的非零填滿因數值可減少隨著索引的增長而拆分頁的需求,但是索引將需要更多的儲存空間,並且會降低讀取效能。即使對於面向許多插入和更新操作的應用程式,資料庫的讀取次數一般也會超過資料庫寫入次數的 5 到 10 倍。因此,指定一個不同於預設值的填滿因數會降低資料庫的讀取效能,而降低量與填滿因數設定的值成反比。例如,當填滿因數的值為 50 時,資料庫的讀取效能會降低兩倍。讀取效能降低是因為索引包含較多的頁,因此增加了檢索資料所需的磁碟 I/O 操作。
將資料添加到表的末尾
如果新資料在表中均勻分布,則不是 0 或 100 的非零填滿因數對效能有利。但是,如果所有資料都添加到表的末尾,則不會索引頁預留空間頁中的可用空間。例如,如果索引鍵列是 IDENTITY 列,則新行的鍵將總是增加,並且索引行在邏輯意義上將添加到索引的末尾。如果將用加長行的大小的資料來更新現有行,則請使用小於 100 的填滿因數。每頁上的額外位元組將有助於把行中的額外長度造成的頁面分割降低到最小限度。