Sql-Server

基於填充因子的索引中數據的行為

  • April 2, 2012

假設您有一個預設填充因子為 20 的數據庫。每當插入數據時,它是否只創建填充到 20% 的頁面?

據我了解,當插入數據時,頁面中大約有 20% 的數據。然而,當數據更新時,它將擴展到索引的 20% 以上,直到填充它並生成頁面拆分,對嗎?

填充因子僅在創建或重建索引時發揮作用。 它是在這些操作期間填充的葉級頁面的索引的消耗量。(有關受影響頁面級別的更多說明,請參閱下面的註釋

INSERT當對數據( 、UPDATE和/或)有 DML 命令時DELETE,它會發生在相應的受影響索引上。換句話說,如果您的頁面填充了 20%,並且您在該頁面中插入數據,則該頁面將包含超過 20% 的數據(例如,假設 35%)。再做一次插入,現在頁面填充了 64%。重建索引,葉級頁面現在將相對包含您指定的空間百分比(或隱含的伺服器預設值)。

注意,不指定為時PAD_INDEXON填充因子僅適用於葉級頁面。但設置時PAD_INDEX = ON,填充因子將考慮到索引的中間級頁面。 預設為OFF

調整填充因子(而不是使用預設的 100/0)的原因是為了在插入或更新數據時最大限度地減少頁面拆分。但請記住,沒有什麼是免費的。填充因子越低,通常佔用的空間數據就越多。如果為索引保留 80% 的可用頁面空間,它們將消耗相對較大的磁碟空間,從而導致更多的讀取。

據我了解,當插入數據時,頁面中大約有 20% 的數據。然而,當數據更新時,它將擴展到索引的 20% 以上,直到填充它並生成頁面拆分,對嗎?

插入數據時,它將插入到相應頁面的相應索引中。 這很可能並且很可能會導致頁面消耗高於填充因子。

將新數據添加到完整索引頁面時會發生頁面拆分。 然後 SQL Server 將拆分頁面並將整個頁面中大約一半的數據放入一個新頁面中。同樣,填充因子在這裡不起作用。

降低填充因子的合理原因是盡量減少頁面拆分,從而最大限度地減少索引頁面碎片。

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