建SQL SERVER索引的時候有一個選項,即Fillfactor(填滿因數)。
這個可能很少人會去注意它,但它也是比較重要的。大家可能也都知道有這個東西,但是如何去使用它,可能會比較迷糊。另外,即使你理解了它的原理,也不一定能使用好它,這個還要具體分析索引欄位的更新頻率等等。
記得看書知道有這麼個東西,但是都是看的迷迷糊糊的,不知道幹嗎的,好象設定不設定都一樣的。其實,像索引這些東西,當資料達到幾十萬上百萬的時候,它的效果就表現的很明顯。
填滿因數定義:索引中葉級頁的資料充滿度。它的作用:當系統建立或重建索引時,在每一個索引頁上預先留出一部分空間。使得系統在新增索引資訊時能夠保持索引頁不分裂。它的目的是使索引的頁分裂最小並對效能微調。
(圖A)
看圖A,通過前面說的我們知道資料是按頁存的,根據定義,填滿因數是指圖A中的Page100(Page110,Page120,Page130)的資料的充滿度。如果按預設,填滿因數是為0(0和100%是一樣的),即完全充滿。如果設定60%,則Page100的資料只充滿空間的60%,會有40%的剩餘空間。
填滿因數只在建立索引時執行;索引建立後,當表中進行資料的添加、刪除或更新時,不會保持填滿因數。即建立索引完後添加資料,比如添加”COM”,則會添加在Page100的”CON”的前面,此時Page100的剩餘空間將小於40%。因為充滿度只有60%,所以”Barr”和”CON”之間會有空隙,所以”COM”將直接插入他們之間,不會照成資料移動和頁分裂。如果充滿度是100%即整頁充滿資料,則會照成”CON”及它後面的資料都向後移動1位,然後在”CON”前面插入”COM”,而Page100會大約一半的行(後半部)移到新頁中以便為新行騰出空間(這種重組稱為頁面分割。頁面分割會降低效能並使表中的資料存放區產生片段.),在這些移動的過程中一方面速度明顯下降,另一方面會產生片段。添加完資料後要使填滿因數繼續保持60%則需要重建索引。
有人將填滿因數比喻成下面這個例子:
為了給一個班的10個同學排一下順序,我們可以給每一位同學一個編號,如:
a. 從1,2,3,4,5,6,7,9,10。這時,我們說填滿因數是100.
此時,如果又來了新同學,而其排名要在中間某位置的話,我們就要改變許多個同學的號碼,如新同學排第5位,就需要4號以後的同學號碼都加1,再將新同學編為5號才行.
b.我們又可以給同學這樣編號:1,3,5,7,9,11,13,15,17,19
也同樣完成了順序的排列.我們說這時填滿因數是50%,此時如果來了新同學,又是排在第5位的話,那麼我們只需將其號碼編為8就行了.其它同學都不用變.
可見,填滿因數大的時候,點用的號碼空間小,耗費資源少,小的時候,佔用資源加大,但操作方便,迅速.
填滿因數大的時候,插入或修改記錄後重新索引的工作會很大,磁碟IO操作增加,效能必然降低,但其佔用空間小.填滿因數小的時候,索引檔案佔用磁碟及記憶體空間相對要大,但是,系統本身重新索引所需IO操作減少,效能提高,只是多佔用一些儲存空間. 孰輕孰重要自已決定。
通常只有當不會對資料變更時(例如,在唯讀表中)才會使設定100%。另外,只有當在表中根據現有資料建立新索引,並且可以精確預見將來會對這些資料進行哪些更改時,將填滿因數選項設定為另一個值才有用。所以填滿因數不是很容易設定的。
SQL SERVER索引最佳化系列之一:工作原理&聚簇索引|非聚簇索引
SQL SERVER索引最佳化系列之二:索引效能考慮
SQL SERVER索引最佳化系列之三:填滿因數