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

深入 SQL Server 儲存引擎:使用 DBCC IND 與 DBCC PAGE 檢視資料與索引頁

     編輯:關於SqlServer

前言

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

步驟 1:用 DBCC IND 找出頁面

DBCC IND('MSSQLTIPS', 'Employee', -1);

關鍵欄位:PageFID(檔案號)、PagePID(頁碼)、IndexID(sys.indexes.index_id)、PageType(1=資料頁, 2=索引頁, 10=IAM)、IndexLevel(0=葉層)。

結果顯示:

  • 叢集索引 (IndexID=1, PageType=1) 在 File 1, Page 143
  • 非叢集索引 (IndexID=2, PageType=2) 在 File 1, Page 153

步驟 2:用 DBCC PAGE 檢視叢集索引資料頁

DBCC PAGE('MSSQLTIPS', 1, 143, 3) WITH TABLERESULTS;

輸出末尾可見三筆資料列依槽位 0/1/2 儲存,欄位值清晰可見。

步驟 3:檢視非叢集索引頁

DBCC PAGE('MSSQLTIPS', 1, 153, 3) WITH TABLERESULTS;

索引鍵按 (LastName, FirstName) 排序,葉層包含叢集鍵 EmployeeID,供書簽查找使用。

步驟 4:移除叢集索引觀察堆表差異

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),而非叢集鍵。

結語

這兩個命令雖非官方支援,但為深入理解儲存引擎、解決阻塞死鎖、分析頁面分裂提供了不可替代的視角。

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