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

SQL Server 叢集索引深度解析:B-Tree 結構、資料頁即葉頁、分頁導航與 DBCC 實戰驗證

     編輯:關於SqlServer

叢集索引將資料表**物理排序**並構建 B-Tree,**葉頁即資料頁**。本文透過 DBCC IND、DBCC PAGE 實測,驗證叢集索引建立前後資料頁變化、葉頁有序儲存、中繼頁導航結構,徹底理解為何邏輯讀從 1636 降至 3。

一、無索引 vs 有叢集索引:IO 對比

  • 堆表:SELECT * FROM Product WHERE ProductID = 123 → **Table Scan**,邏輯讀 1636、物理讀 9。
    堆表 Table Scan IO DBCC IND 堆表 1637 頁含 IAM
  • 叢集索引:建立 CREATE CLUSTERED INDEX ... ON Product(ProductID) 後同樣查詢 → **Clustered Index Seek**,邏輯讀 **3**、物理讀 0。
    叢集索引 Seek IO

二、葉頁驗證:資料實際有序儲存

建立無序測試資料

CREATE TABLE Person (ID INT, NAME CHAR(900));
INSERT INTO Person VALUES (3, 'ccccc'), (1, 'aaaaa'), (2, 'bbbbb');  -- 故意無序

DBCC IND 顯示資料在 Page 148。
建立叢集索引前頁面

建立叢集索引後

CREATE CLUSTERED INDEX Ctrip_idx_ID ON Person(ID);

原 Page 148 消失,新生成 **Page 173 為索引葉頁**(即資料頁)。
建立叢集索引後頁面

DBCC PAGE 驗證葉頁內容 (Page 173, Option 1)

叢集索引葉頁內容

  • Slot 0,1,2 依 **ID 1,2,3 有序排列**(aaaaa, bbbbb, ccccc)。
  • 完整資料列(含所有欄位)直接儲存於葉頁,**無額外 RID/Key Lookup**。

三、中繼/根頁導航結構

插入 1000 筆資料撐破單葉頁

1000 筆資料頁面分佈

  • 根頁:Page 120 (IndexLevel=2)
  • 中繼頁:無(兩層樹)
  • 葉頁:Page 173, 121, 126 (IndexLevel=0)

DBCC PAGE 解析根頁 (Page 120, Option 3)

根頁 Option 3 輸出

每筆記錄結構:

  • MinKey:子頁最小索引鍵值(首筆記錄除外,為 0)
  • Child PageID:0xAD = 173, 0x79 = 121, 0x7E = 126
  • Child FileID:1

Option 1 更直觀:根頁 Option 1 可讀格式

四、叢集索引 B-Tree 結構圖解

叢集索引 B-Tree 結構圖

查詢 WHERE ID = 500:根頁比對 MinKey 範圍 → 導航至 Page 121 → 葉頁二分搜尋 Slot → 直接輸出完整列。

五、為何一張表只能有一個叢集索引?

因為**資料列實體只能有一種物理排序順序**。叢集索引**即**資料表的物理組織形式,非邏輯疊加層。

總結

  • 叢集索引 = **資料表本身按 Key 有序組織**,葉頁 = 資料頁。
  • B-Tree 導航:根/中繼頁儲存 MinKey + Child PageID,層數極少(百萬列通常 3-4 層)。
  • DBCC IND 定位頁面、DBCC PAGE 驗證有序性與導航結構,是理解儲存引擎核心技能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved