程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL SERVER索引優化之填充因子

SQL SERVER索引優化之填充因子

編輯:關於SqlServer

建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%。另外,只有當在表中根據現有數據創建新索引,並且可以精確預見將來會對這些數據進行哪些更改時,將填充因子選項設置為另一個值才有用。所以填充因子不是很容易設置的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved