在 SQL Server 2008 的儲存架構中,全域配置對應(Global Allocation Map,GAM)與共用全域配置對應(Shared Global Allocation Map,SGAM)是兩種關鍵的系統頁面,它們負責追蹤資料庫檔案中「區」的分配狀態。要理解它們的運作原理,必須先從資料庫的基本儲存單位——頁與區——說起。
SQL Server 資料庫由一或多個作業系統檔案組成。邏輯上,最小的儲存單位是頁,大小固定為 8 KB。資料檔案內的頁面從 0 開始連續編號,透過「資料庫 ID + 檔案 ID + 頁碼」即可唯一定位任一頁面。
空間管理的最小單位則是區,由 8 個邏輯上連續的頁面組成(共 64 KB)。為了提升空間利用率,SQL Server 2008 採用兩種類型的區:
GAM 頁面記錄資料庫檔案中哪些區已被分配及其用途。每個 GAM 頁面覆蓋約 64,000 個區(約 4 GB 資料空間),對應每個區有一個位元:
此位元定義與直覺相反(通常 1 代表使用中),需特別留意。
SGAM 頁面專門記錄哪些區目前被作為混合區使用,且至少有一個頁面尚未被佔用。同樣覆蓋約 4 GB 空間,位元定義如下:
| 區的當前使用狀態 | GAM 位元 | SGAM 位元 |
|---|---|---|
| 自由、未使用 | 1 | 0 |
| 統一區或已滿的混合區 | 0 | 0 |
| 含有可用頁面的混合區 | 0 | 1 |
在每個資料庫檔案中,關鍵系統頁面的位置固定:
之後每 511,230 頁(約 4 GB)會再出現一組 GAM/SGAM 頁面,形成週期性結構。
透過未文件化的 DBCC PAGE 指令可檢視頁面內容。例如:
DBCC TRACEON(3604);
DBCC PAGE(TESTDB, 1, 2, 3); -- 檢視 GAM 頁面(檔案 1,第 2 頁,printopt=3)
DBCC PAGE(TESTDB, 1, 3, 3); -- 檢視 SGAM 頁面(檔案 1,第 3 頁,printopt=3)
輸出包含四大區塊:BUFFER(記憶體緩衝資訊)、PAGE HEADER(頁首)、DATA(資料區)、OFFSET TABLE(位移表)。GAM/SGAM 的 DATA 區以位元陣列儲存分配圖,需注意位元順序反轉(Little-endian)的解讀方式。
輔助工具 SQL Internals Viewer(官網)提供圖形化介面,可直觀觀察頁面結構與分配狀態,極大降低分析門檻。
掌握 GAM/SGAM 機制,有助於深入理解 SQL Server 的空間配置行為、排查配置爭用問題,並為容量規劃提供理論依據。