The two most important days in your life are the day you were born and the day you find out why. -Mark Twain

#45 資料庫基礎 - Page 的 Fill Factor

前面的文章介紹了許多資料庫引擎中有關 Storage management 的部份,讓你能了解資料庫引擎在處理儲存與讀取資料時所使用的原理基礎.但這些也都只是基礎的運作原理,真正實作的方式也會因為產品的不同也有些差異,但至少你知道了原理,這就能幫助你了解資料庫引擎的工作,也希望對你的學習與工作能有所幫助.

這篇文章將說明的是一個 Storage management 中管理資料的選項,對我而言,這是一個設計技巧.還記得前面的文章中曾提過 Page - 這是資料庫引擎用來儲存資料時所用的一個管理單位.一個 page 可能會有 4K 或 8K 或其他大小的容量設計,所以每個 page 的容量幾乎都是固定的.對一般正常運作的資料庫系統來說,對資料一定會進行新增刪除與修改的功能,所以這樣子的工作就常常會導致 page split 的現象,這個現象在前面的文章曾提過.page split 就相當於是在一個 list 中插入一個新的元素一樣,其運作成本比較高,如果再加上硬碟資料散亂度過大的話.所以,為了減少 page split 的現象,因此存在了 fill factor 的設計.

Fill factor 的意思就是當一個新的 page 產生要寫入資料時,資料庫引擎不會將所有資料空間都拿來寫入資料,而是會留下某一個百分比的空閒空間.這個百分比的大小基本上是可人為控制的.比如,當我們告訴資料庫引擎 fill factor 為 80% 時,則資料庫引擎在 page split 發生或是需要建立新的 page 時,當它寫入資料時只會佔用掉  80% 的可用空間.而剩下的 20% 就留做未來在做資料新增修改時可以利用的空閒空間.舉個例子說明,你有一份學生資料放在資料庫中,而學生資料假設定依照學生姓名排序 (primary key).假設一開始並沒有設定 fill factor,而它的預設值是 100%,所以這表示所有的學生資料都依序寫入到 page 之中.資料越多,所需要的 page 也會越多.而在這些 page 之間都沒有留下任何的空閒空間.而今天來了一個新學生,他的名字剛好是排在所有學生的中間,當它的資料寫入到資料庫時,資料庫引擎發現它需要在這些 page 中間做一個 page split.Page split 做完後,一個 page 變成 2 個 page,所以這兩個 page 都多有了 50% 的空閒空間,因此新學生的資料就可以寫進去這中間的 page 了.所以,如果一開始設定了 fill factor = 50%,那表示在一開始學生資料寫入到 page 時只會佔用一半的空間,因此每個 page 都有一半的空閒空間.當新的學生資料需要新增時,資料庫引擎找到目的 page  後發現還有一半空閒空間並且足夠用來寫入新資料,則就直接將新資料寫入而不需要做 page split 的動作,因此也讓資料新增的動作可以更快地完成.所以,你可以把 fill factor 想成是一種利用空間來換取時間的方法.這對於經常需要做新增動作的資料庫來說相當有幫助.對於資料變動很小的資料庫來說並沒有什麼太大的好處.

因此,如果你採用的資料庫引擎有提供 page split 的觀察指標,你可以查看你有那些 table 經常發生 page split 的現象,如果有的話,你可以將 table 的 fill factor 改小一點來降低 page split 的發生.

其實 fill factor 也只是一個應用,像這樣預先預留空間做為未來使用的情況,在很多產品的設計都會用到這樣子的 idea,基本上都是用空間來換點時間的做法.希望這樣的 idea 有一天也能幫助你的設計.


Share: