DBCC IND 與 DBCC PAGE 為非文件化命令,可窺探資料庫引擎如何在 8KB 頁面上儲存資料與索引,對除錯、效能分析極有價值。
DBCC IND ('database_name'|db_id, 'table_name', index_id)
-- index_id: -1=所有索引與IAM, -2=僅IAM
DBCC PAGE ('database_name'|db_id, file_id, page_id, print_option)
-- print_option: 0=僅頁首, 1=頁首+槽位, 2=頁首+完整資料, 3=頁首+詳細資料(含槽位陣列)
執行前需開啟追蹤旗標:DBCC TRACEON(3604) 將輸出導向用戶端。
CREATE DATABASE MSSQLTIPS;
CREATE TABLE dbo.Employee (
EmployeeID INT IDENTITY(1,1),
FirstName VARCHAR(50) NOT NULL,
LastName VARCHAR(50) NOT NULL,
Date_Hired DATETIME NOT NULL,
Is_Active BIT NOT NULL DEFAULT 1,
CONSTRAINT PK_Employee PRIMARY KEY (EmployeeID),
CONSTRAINT UQ_Employee_LastName UNIQUE (LastName, FirstName)
);
INSERT ... -- George Washington, Benjamin Franklin, Thomas Jefferson
DBCC IND('MSSQLTIPS', 'Employee', -1);
關鍵欄位:PageFID(檔案號)、PagePID(頁碼)、IndexID(sys.indexes.index_id)、PageType(1=資料頁, 2=索引頁, 10=IAM)、IndexLevel(0=葉層)。
結果顯示:
DBCC PAGE('MSSQLTIPS', 1, 143, 3) WITH TABLERESULTS;
輸出末尾可見三筆資料列依槽位 0/1/2 儲存,欄位值清晰可見。
DBCC PAGE('MSSQLTIPS', 1, 153, 3) WITH TABLERESULTS;
索引鍵按 (LastName, FirstName) 排序,葉層包含叢集鍵 EmployeeID,供書簽查找使用。
ALTER TABLE dbo.Employee DROP CONSTRAINT PK_Employee;
ALTER TABLE dbo.Employee ADD CONSTRAINT PK_Employee PRIMARY KEY NONCLUSTERED (EmployeeID);
DBCC IND('MSSQLTIPS', 'Employee', -1);
DBCC PAGE('MSSQLTIPS', 1, 155, 3) WITH TABLERESULTS; -- 新非叢集索引頁
堆表上非叢集索引改存 File:Page:Slot 物理定位器(RID),而非叢集鍵。
這兩個命令雖非官方支援,但為深入理解儲存引擎、解決阻塞死鎖、分析頁面分裂提供了不可替代的視角。