首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2008 儲存結構深度解析:GAM 與 SGAM 頁面機制

     編輯:關於SqlServer

前言:從頁面與區談起

在 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 採用兩種類型的區:

  • 統一區:專屬於單一物件(資料表或索引),其 8 頁僅供該物件使用。
  • 混合區:最多可被 8 個物件共享。新建立的資料表或索引優先從混合區配置頁面;當增長到 8 頁以上,後續配置改用統一區。

GAM 頁面:追蹤區的分配狀態

GAM 頁面記錄資料庫檔案中哪些區已被分配及其用途。每個 GAM 頁面覆蓋約 64,000 個區(約 4 GB 資料空間),對應每個區有一個位元:

  • 位元 = 1:該區為自由(未使用)區。
  • 位元 = 0:該區正在使用中(已分配)。

此位元定義與直覺相反(通常 1 代表使用中),需特別留意。

SGAM 頁面:追蹤混合區的可用空間

SGAM 頁面專門記錄哪些區目前被作為混合區使用,且至少有一個頁面尚未被佔用。同樣覆蓋約 4 GB 空間,位元定義如下:

  • 位元 = 1:對應區為混合區,且有可用頁面。
  • 位元 = 0:對應區非混合區,或為已滿的混合區。

GAM 與 SGAM 位元組合對照表

區的當前使用狀態GAM 位元SGAM 位元
自由、未使用10
統一區或已滿的混合區00
含有可用頁面的混合區01

空間配置決策邏輯

  • 需配置全新統一區:掃描 GAM,尋找位元為 1 的區。
  • 需配置有可用空間的混合區:掃描 GAM 位元為 0 且 SGAM 位元為 1 的區。
  • 若無可用混合區:從 GAM 找一個全新區,標記為混合區(GAM=0, SGAM=1),再使用其中一頁。
  • 若 GAM 全為 0:檔案已滿,需擴充檔案或新增檔案。

固定頁面位置與週期性重複

在每個資料庫檔案中,關鍵系統頁面的位置固定:

  • 第 0 頁:檔案標頭頁
  • 第 1 頁:PFS 頁面
  • 第 2 頁:第一個 GAM 頁面
  • 第 3 頁:第一個 SGAM 頁面
  • 第 6 頁:DCM 頁面
  • 第 7 頁:BCM 頁面

之後每 511,230 頁(約 4 GB)會再出現一組 GAM/SGAM 頁面,形成週期性結構。

實戰觀察:使用 DBCC PAGE 與 Internals Viewer

透過未文件化的 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(官網)提供圖形化介面,可直觀觀察頁面結構與分配狀態,極大降低分析門檻。

常見誤區與總結

  1. BUFFER 資訊僅在頁面駐留記憶體時有意義,重啟或清空快取後位址會改變,官方文件極少,不宜深究。
  2. PAGE HEADER 部分欄位缺乏官方文件支援,避免過度解讀。
  3. SGAM 的 ALLOCATED/NOT ALLOCATED標籤易誤解:ALLOCATED 實指「含可用頁面的混合區」,NOT ALLOCATED 指「統一區或已滿混合區」。
  4. GAM 位元邏輯反直覺:0=已用,1=自由。
  5. 新建資料庫僅 280 頁(35 區),GAM/SGAM 顯示的後續區資訊實為預留空間,非實際存在。
  6. DBCC PAGE printopt=3 輸出的區範圍呈斷續狀,係因位元陣列跨字節邊界導致視覺上非連續。
  7. 位元組解碼需「位元反轉」:每字節內 8 位元順序相反,解讀時須逐字節反轉。

掌握 GAM/SGAM 機制,有助於深入理解 SQL Server 的空間配置行為、排查配置爭用問題,並為容量規劃提供理論依據。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved