SQL Server 儲存引擎的基本單位是「頁」,理解頁結構、頁類型、頁面分配機制,是效能調優、碎片整理、損壞修復、容量規劃的基石。本文深入剖析 8KB 頁架構、九大頁類型、PFS/GAM/SGAM/IAM 分配位圖、Extent 混合/一致區、以及實戰診斷查詢。
| 頁類型 | 代碼 | 名稱 | 用途 | 關鍵特徵 |
|---|---|---|---|---|
| 1 | 0x01 | Data Page | 堆表/叢集索引葉層資料列 | 最常見,含行位移陣列,支援轉寄指標 |
| 2 | 0x02 | Index Page | 非叢集索引葉層、所有索引中間層 | 只存索引鍵+書籤,無完整資料列 |
| 3 | 0x03 | Text/Image Page | LOB 資料 (text/ntext/image/xml/varchar(max) 等) | 樹狀結構,根節點在資料列,支援部分更新 |
| 4 | 0x04 | GAM (Global Allocation Map) | 記錄 Extent 分配狀態 (全域) | 每 4GB (64,000 Extents) 一頁,位圖:0=已分配,1=空閒 |
| 5 | 0x05 | SGAM (Shared Global Allocation Map) | 記錄混合 Extent 分配狀態 | 同 4GB 間隔,位圖:1=混合且有空閒頁,0=否 |
| 6 | 0x06 | PFS (Page Free Space) | 記錄頁面空閒空間百分比 | 每 8,088 頁一頁,每頁 1 位元組:0=空,1=1-50%,2=51-80%,3=81-95%,4=96-100% |
| 7 | 0x07 | IAM (Index Allocation Map) | 追蹤物件擁有的 Extents/頁 | 每個堆/索引分區至少一個 IAM 鏈,串聯 Extent 範圍 |
| 8 | 0x08 | BCM (Bulk Changed Map) | 大量載入後已變更的 Extents | 支援差異備份、CDC,位圖標記 |
| 9 | 0x09 | DCM (Differential Changed Map) | 上次完整備份後已變更的 Extents | 支援差異備份,位圖標記 |
| 頁號 | 類型 | 說明 |
|---|---|---|
| 0 | File Header | 檔案屬性、版本、檢查點 LSN、最大檔案大小 |
| 1 | PFS | 第一個 PFS 頁,覆蓋頁 0-8,087 |
| 2 | GAM | 第一個 GAM 頁,覆蓋前 4GB |
| 3 | SGAM | 第一個 SGAM 頁,覆蓋前 4GB |
| 4-5 | DCM/BCM | 第一組差異/大量變更位圖 |
| 6 | Boot Page (僅主檔) | 資料庫啟動資訊、版本、相容等級、檢查點 |
SELECT
allocated_page_page_id AS page_id,
page_type_desc,
extent_page_id,
is_allocated,
is_iam_page,
is_mixed_page_allocation,
previous_page_page_id,
next_page_page_id
FROM sys.dm_db_database_page_allocations(DB_ID(), OBJECT_ID('dbo.Orders'), NULL, NULL, 'DETAILED');
DBCC TRACEON(3604); -- 輸出到客戶端
DBCC PAGE (db_id, file_id, page_id, 3); -- 3 = 完整輸出含資料列
DBCC TRACEOFF(3604);
SELECT
OBJECT_NAME(ips.object_id) AS table_name,
i.name AS index_name,
ips.index_type_desc,
ips.avg_fragmentation_in_percent,
ips.fragment_count,
ips.page_count
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') ips
JOIN sys.indexes i ON ips.object_id = i.object_id AND ips.index_id = i.index_id
WHERE ips.avg_fragmentation_in_percent > 10 AND ips.page_count > 100
ORDER BY ips.avg_fragmentation_in_percent DESC;
EXEC sp_spaceused 'dbo.Orders', @updateusage = 'TRUE';
-- 或查詢分配單元
SELECT
OBJECT_NAME(p.object_id) AS table_name,
au.type_desc,
au.total_pages,
au.used_pages,
au.data_pages
FROM sys.allocation_units au
JOIN sys.partitions p ON au.container_id = p.partition_id
WHERE OBJECT_NAME(p.object_id) = 'Orders';
FILLFACTOR = 80-90 為高更新表預留空間,減少頁分裂;唯讀/僅追加表設 100。varchar(max) 小於 8KB 存行內,大於移至 Text/Image 頁;sp_tableoption 'large value types out of row' 強制行外。SQL Server 的 8KB 頁是儲存、索引、記錄、備份、恢復的統一度量單位。掌握 Data/Index/Text 頁儲存業務資料,GAM/SGAM/PFS/IAM 四大位圖管理空間分配,Extent 混合/一致區平衡小大物件,配合 dm_db_database_page_allocations、DBCC PAGE、dm_db_index_physical_stats 實戰診斷,即可從頁面層面透視資料庫行為,制定精準的效能、維護、容量策略。