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

SQL Server 資料頁面頭部結構深度解析:DBCC PAGE 實戰教學

     編輯:關於SqlServer

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_headerVersion1頭部版本,SQL 7.0 後固定為 1
m_type1頁面類型:1=資料頁, 2=索引頁, 3=Text混合頁, 10=IAM
m_typeFlagBits0x4資料/索引頁為 0x4,其他為 0
m_level0B-tree 層級,0=葉層
m_flagBits0x8000頁面標記位
m_objId / AllocUnitId.idObj83物件 ID (舊版)
m_indexId / AllocUnitId.idInd256索引 ID (0=堆積, 1=叢集, >1=非叢集)
Metadata: AllocUnitId72057594043367424儲存單元 ID (新版統一)
Metadata: PartitionId72057594038386688分區 ID
Metadata: IndexId0索引 ID
Metadata: ObjectId2089058478物件 ID (可用 OBJECT_ID 取得)
m_prevPage / m_nextPage(0:0)雙向鏈表前後頁 (堆積無序,索引有序)
pminlen26固定長度資料最小位元組:4(行開銷)+4(int)+8(datetime)+10(char(10))
m_slotCnt2頁面行數 (Slot 陣列項目數)
m_freeCnt8034頁面剩餘可用位元組 = 8192 - m_freeData - 2*m_slotCnt
m_freeData154從頁面開頭到最後一筆資料結尾的位移 = 96(頭部) + (7+22)*2
m_reservedCnt0活動交易保留的空間
m_lsn(30:170:20)最後修改日誌序號 (LSN)
m_xactReserved0最近交易保留增量
m_xdesId(0:0)最近交易 ID
m_ghostRecCnt0鬼魂記錄數 (已刪除待清理)
m_tornBits0頁面檢驗碼 (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

結構變更對頁面的影響

  • ALTER COLUMN 增加長度: 若無重建,資料不動,新資料使用新長度,頁面碎片化。
  • DROP COLUMN: 僅標記欄位為 dropped,空間不立即回收,需 REBUILD。
  • 行溢出: 變長欄位超過 8060 限制時,資料移至 ROW_OVERFLOW 頁面,原頁面保留 24-byte 指標。

實務應用場景

  • 損壞頁面分析:DBCC PAGE(..., 3) 檢視完整資料列,配合 DBCC CHECKDB 定位損壞範圍。
  • 空間壓縮評估:觀察 m_freeCnt、m_slotCnt 判斷填充因子效果。
  • 索引碎片診斷:檢視 m_prevPage/m_nextPage 鏈表順序與邏輯順序偏差。

深入理解頁面結構,是進行 SQL Server 進階效能調校、損壞修復、法務鑑識的基石能力。

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