之前就詳細看過,可是今天又回頭看到這裡的時候,卻發現忘的差不多了,真悲劇,看來還是要記錄下比較好啊。
Sql Server 區管理(GAM,SGAM)
大家都知道Sql Server 中資料檔案儲存的最小單位是頁面(Page),但實際SQLSERVE並不是以頁面為單位給資料分配空間的,Sql Server預設的儲存分配單位是盤區(Extend)。這樣做的主要原因是為了避免頻繁的讀寫IO,提升效能。在表或其它對象分配儲存空間,不是直接分配一個8K的頁面,而是以一個盤區(Extend)為儲存分配單位,一個盤區為8個頁面(Size = 8*8K=64K)。
這樣,對區得操作就會非常頻繁,也要求Sql Server有自己的一套系統管理著數量眾多的區。其中最突出的出一個問題,那就是在儲存那些只有少量資料,不足8K的對象,如果也是分配給一個盤區,就會存在儲存空間上的浪費,降低了空間分配效率。
為解決上述問題,SQLSERVER提供了一種解決方案,定義了兩種盤區類型,統一盤區和混合盤區。
全域分配映射表 (GAM) :統一盤區,GAM 頁記錄已指派的區。每個 GAM 包含 64,000 個區,相當於近 4 GB 的資料。GAM 用一個位來表示所涵蓋區間內的每個區的狀態。如果位為 1,則區可用;如果位為 0,則區已指派。
共用全域分配映射表 (SGAM) :由多個對象共同擁有該盤區,SGAM 頁記錄當前用作混合區且至少有一個未使用的頁的區。每個 SGAM 包含 64,000 個區,相當於近 4 GB 的資料。SGAM 用一個位來表示所涵蓋區間內的每個區的狀態。如果位為 1,則區正用作混合區且有可用頁。如果位為 0,則區未用作混合區,或者雖然用作混合區但其所有頁均在使用中。
在實際為對象分配儲存盤區時,為了提高空間利用率,預設的情況下,如果一個對象一開始大小小於8個頁面,就盡量放在混合盤區中,如果該對象大小增加到8個頁面後,SQLSERVER會為這個對象重新分配一個統一盤區。
據區當前的使用方式,GAM 和 SGAM 中每個區具有以下位元模式:
這將簡化區管理演算法。若要分配統一區,資料庫引擎將在 GAM 中搜尋為 1 的位,並將其設定為 0。若要尋找具有可用頁的混合區,資料庫引擎將在 SGAM 中搜尋為 1 的位。若要分配混合區,資料庫引擎將在 GAM 中搜尋為 1 的位,將其設定為 0,然後將 SGAM 中對應的位設定為 1。若要釋放區,資料庫引擎確保將 GAM 位設定為 1,將 SGAM 位設定為 0。實際上,資料庫引擎內部使用的演算法比本主題中介紹的更為複雜,因為資料庫引擎在資料庫中均勻分布資料。但是,由於無需管理區分配資訊鏈,因此即使是實際演算法也會被簡化。
管理Sql Server可用空間
首先摘錄段 MSDN 的一段官方解釋:
頁可用空間 (PFS) 頁記錄每頁的分配狀態,是否已指派單個頁以及每頁的可用空間量。PFS 對每頁都有一個位元組,記錄該頁是否已指派。如果已指派,則記錄該頁是為空白、已滿 1% 到 50%、已滿 51% 到 80%、已滿 81% 到 95% 還是已滿 96% 到 100%。
將區分配給對象後,資料庫引擎將使用 PFS 頁來記錄區中的哪些頁已指派或哪些頁可用。資料庫引擎必須分配新頁時,將使用此資訊。保留的頁中的可用空間量僅用於堆和 Text/Image 頁。資料庫引擎必須找到一個具有可用空間的頁來儲存新插入的行時,使用此資訊。索引不要求跟蹤頁的可用空間,因為插入新行的點是由索引索引值設定的。
在資料檔案中,PFS 頁是檔案頭頁之後的第一頁(頁碼為 1)。接著是 GAM 頁(頁碼為 2),然後是 SGAM 頁(頁碼為 3)。第一個 PFS 頁之後是一個大小大約為 8,000 頁的 PFS 頁。在第 2 頁的第一個 GAM 頁之後還有另一個 GAM 頁(包含 64,000 個區),在第 3 頁的第一個 SGAM 頁之後也有另一個 SGAM 頁(包含 64,000 個區)。顯示了資料庫引擎用來分配和管理區的頁順序。
看過之後,讓人一頭霧水,真是不知所云,真佩服這些 MSDN 是如何翻譯的,看來中文 MSDN 太不靠譜,最後沒辦法,只能google了
其實上面說的意思就是:Sql Server 管理可用空間的方法是,尋找每個每個頁面是否使用,以及使用方式情況。這時就需要一個頁面來記錄各個頁面的使用方式了,這就是 PFS 頁。
PFS(Page Free Space),也叫頁面自由空間,該頁面用來跟蹤一個檔案中每一個特定的頁面的利用率情況。一個檔案中第二個頁面(頁碼1)就是PFS頁面,該頁面的每個位元組都記錄了相應頁面的分配情況、頁面類型、是否IAM頁、是否包含刪除記錄、以及空間利用率資訊;PFS能夠管理和跟蹤8088個頁面的使用方式,即接近64M的空間,以後每8088個頁面將再出現一次。
讓我們首先瞭解一下PFS的頁面管理位元組的構造,管理單位為位元組,每位元組管理一個頁面。
第0個bit為保留位元組,始終為0
第1個bit表示該頁面是否已指派,我們知道GAM頁用來管理區是否已指派,但一個區包含8個頁面,所以用該bit用來準確定位該區的某個頁面是否已指派出去了。
第2個bit表示該頁面是否混合分區的一個頁面。
第3個bit表示該頁面是否是一個IAM(索引配置對應)頁面。
第4個bit表示該頁面中是否包含幻影或已刪除記錄,這有助於SQL Server定期清理幻影或已刪除記錄。
第5~7個頁面表示該頁面的空間使用率情況。