SQL Server 以 8KB 頁面為基本儲存單位。透過 DBCC PAGE 可檢視頁面頭部結構,理解資料儲存、空間管理、行溢出等核心機制。
IF OBJECT_ID('dbo.TestPage') IS NOT NULL DROP TABLE dbo.TestPage;
CREATE TABLE dbo.TestPage (ID INT, Birth DATETIME, Name CHAR(10));
INSERT INTO dbo.TestPage VALUES (1, '2009-11-27', 'aaaa'), (2, '2009-11-27', 'aaaa');
EXEC sp_spaceused 'TestPage';
-- 結果: 2 rows, 16 KB reserved, 8 KB data, 8 KB index_size, 0 KB unused
-- 查詢表所屬頁面
DBCC IND('TestDB', 'TestPage', 0);
-- 假設輸出頁面 109 (IAM), 89 (Data Page)
-- 啟用輸出到用戶端
DBCC TRACEON(3604);
-- 檢視頁面 89 (資料頁) 完整內容
DBCC PAGE('TestDB', 1, 89, 1); -- 第 4 參數: 0=僅頭部, 1=頭部+資料, 2=頭部+資料+位移, 3=完整
| 欄位 | 範例值 | 含義 |
|---|---|---|
| m_pageId | (1:89) | 檔案號:頁面號,唯一標識頁面 |
| m_headerVersion | 1 | 頭部版本,SQL 7.0 後固定為 1 |
| m_type | 1 | 頁面類型:1=資料頁, 2=索引頁, 3=Text混合頁, 10=IAM |
| m_typeFlagBits | 0x4 | 資料/索引頁為 0x4,其他為 0 |
| m_level | 0 | B-tree 層級,0=葉層 |
| m_flagBits | 0x8000 | 頁面標記位 |
| m_objId / AllocUnitId.idObj | 83 | 物件 ID (舊版) |
| m_indexId / AllocUnitId.idInd | 256 | 索引 ID (0=堆積, 1=叢集, >1=非叢集) |
| Metadata: AllocUnitId | 72057594043367424 | 儲存單元 ID (新版統一) |
| Metadata: PartitionId | 72057594038386688 | 分區 ID |
| Metadata: IndexId | 0 | 索引 ID |
| Metadata: ObjectId | 2089058478 | 物件 ID (可用 OBJECT_ID 取得) |
| m_prevPage / m_nextPage | (0:0) | 雙向鏈表前後頁 (堆積無序,索引有序) |
| pminlen | 26 | 固定長度資料最小位元組:4(行開銷)+4(int)+8(datetime)+10(char(10)) |
| m_slotCnt | 2 | 頁面行數 (Slot 陣列項目數) |
| m_freeCnt | 8034 | 頁面剩餘可用位元組 = 8192 - m_freeData - 2*m_slotCnt |
| m_freeData | 154 | 從頁面開頭到最後一筆資料結尾的位移 = 96(頭部) + (7+22)*2 |
| m_reservedCnt | 0 | 活動交易保留的空間 |
| m_lsn | (30:170:20) | 最後修改日誌序號 (LSN) |
| m_xactReserved | 0 | 最近交易保留增量 |
| m_xdesId | (0:0) | 最近交易 ID |
| m_ghostRecCnt | 0 | 鬼魂記錄數 (已刪除待清理) |
| m_tornBits | 0 | 頁面檢驗碼 (CHECKSUM/TORN_PAGE) |
+------------------+ <- Offset 0 | Page Header (96B)| +------------------+ | Row 1 (Data) | <- Slot 0 指向此處 +------------------+ | Row 2 (Data) | <- Slot 1 指向此處 +------------------+ | Free Space | <- m_freeCnt = 8034 bytes +------------------+ | Slot Array (2B/row) | <- 從頁面尾部向前成長 +------------------+ <- Offset 8191
REBUILD。DBCC PAGE(..., 3) 檢視完整資料列,配合 DBCC CHECKDB 定位損壞範圍。m_freeCnt、m_slotCnt 判斷填充因子效果。m_prevPage/m_nextPage 鏈表順序與邏輯順序偏差。深入理解頁面結構,是進行 SQL Server 進階效能調校、損壞修復、法務鑑識的基石能力。