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

SQL Server 2008 儲存架構深度解析:GAM、SGAM、PFS、IAM 頁面結構與 DBCC PAGE 實戰

     編輯:SQL Server 2008

儲存層級總覽

  • 頁面:8 KB,最小 I/O 單位。
  • 區塊:8 頁 = 64 KB,空間配置單位。
  • 檔案:邏輯檔案包含連續頁面 (頁碼 0 起)。
  • 檔案群組:邏輯容器,包含一或多個檔案。

新建資料庫前 9 頁固定配置

頁碼m_type名稱功能
015File Header檔案屬性、版本、大小、成長設定
111PFS (Page Free Space)每頁配置狀態、可用空間百分比
28GAM (Global Allocation Map)追蹤區塊配置狀態 (0=已配置, 1=自由)
39SGAM (Shared GAM)追蹤混合區塊且有自由頁 (1=混合且有自由, 0=其他)
4-50Reserved保留
616DCM (Differential Changed Map)追蹤自上次完整備份後變更的區塊
717BCM (Bulk Changed Map)追蹤自上次記錄備份後大量作業變更的區塊
813Boot Page資料庫啟動資訊 (版本、相容層級、復原模式...)

GAM / SGAM 核心邏輯

  • 每個 GAM/SGAM 頁面覆蓋 **64,000 區塊 ≈ 4 GB** 資料。
  • 檔案 > 4 GB 時,每 511,230 頁 (≈ 4 GB) 會出現新的 GAM/SGAM 頁面。
  • 配置演算法:
     - 需混合區塊 → 掃描 SGAM 找 bit=1。
     - 需統一區塊 → 掃描 GAM 找 bit=1。
     - 兩者皆無 → 檔案成長或報錯 1105。

DBCC PAGE 實戰觀察

-- 開啟輸出到用戶端
DBCC TRACEON(3604);
GO

-- 查看 GAM (頁面 2) 選項 3 (含資料列解碼)
DBCC PAGE('TestDB', 1, 2, 3);
GO

-- 查看 SGAM (頁面 3)
DBCC PAGE('TestDB', 1, 3, 3);
GO

-- 以表格輸出 (選項 1 + WITH TABLERESULTS)
DBCC PAGE('TestDB', 1, 2, 1) WITH TABLERESULTS;
DBCC PAGE('TestDB', 1, 3, 1) WITH TABLERESULTS;

輸出關鍵區段

  • BUFFER:記憶體緩衝區標頭 (每次查詢位址不同)。
  • PAGE HEADER:`m_type`、`m_objId` (AllocUnitId)、`m_lsn` 等。
  • DATA:Slot 0 = 保留 94 bytes;Slot 1 = 位圖資料 (每 bit 對應一區塊)。
  • OFFSET TABLE:各 Slot 起始位移。

位圖解碼範例 (GAM)

第 194-196 bytes (0-based) = `00 00 C0` (hex)。
轉二進位:`1100 0000` → 反轉後 `00 00 11` → 表示前 2 區塊 (0-1) 為自由,其餘已配置。
對應前 128 頁 (16 區塊) 已配置,符合系統物件佔用。

PFS / IAM 簡介

  • PFS (頁 1):每 byte 對應一頁,記錄配置狀態 (配置/未配置)、混合/統一、可用空間 50%/80%/95%/100%。
  • IAM (Index Allocation Map):每個配置單元 (Heap/Index/LOB) 擁有 IAM 鏈,記錄該物件擁有的區塊範圍,供 `DBCC SHOWCONTIG`、掃描使用。

實用查詢:檢視檔案內頁面類型分佈

SELECT
    file_id, page_id,
    CASE page_type
        WHEN 1 THEN 'Data'
        WHEN 2 THEN 'Index'
        WHEN 8 THEN 'GAM'
        WHEN 9 THEN 'SGAM'
        WHEN 11 THEN 'PFS'
        WHEN 13 THEN 'Boot'
        WHEN 15 THEN 'FileHeader'
        WHEN 16 THEN 'DCM'
        WHEN 17 THEN 'BCM'
        ELSE 'Other(' + CAST(page_type AS VARCHAR) + ')'
    END AS PageType,
    page_level, allocation_unit_id
FROM sys.dm_db_database_page_allocations(DB_ID(), NULL, NULL, NULL, 'DETAILED')
WHERE page_type IN (1,2,8,9,11,13,15,16,17)
ORDER BY file_id, page_id;

總結

理解 GAM/SGAM/PFS/IAM 運作機制,有助於:排查配置爭用 (SGAM 熱點)、解讀 `DBCC CHECKDB` 輸出、規劃檔案群組與成長策略、優化大量載入 (最小化記錄配置)。

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