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

SQL Server 非叢集索引深度解析:B-Tree 結構、Key+RID 儲存、書籤查詢與實戰 DBCC 驗證

     編輯:關於SqlServer

非叢集索引如何實現「毫秒級查找」?本文從現象切入,結合 DBCC IND、DBCC PAGE 實測,揭示非叢集索引 **B-Tree 結構**、**Key + RID 儲存格式**、**書籤查詢** 完整鏈路。

一、現象:執行計畫中的 Index Seek + RID Lookup

查詢 WHERE Name = 'jjjjj' 走非叢集索引 idx_Person_Name:

執行計畫 Index Seek + RID Lookup

關鍵觀察:Index Seek (NonClustered) 後接 RID Lookup(堆表)或 Key Lookup(叢集索引表)。

二、什麼是 RID (Row ID)?

RID = FileID : PageID : SlotID,唯一定位堆表中某資料列的物理座標。

驗證函數:sys.fn_PhysLocFormatter(%%physloc%%)

SELECT ProductID, sys.fn_PhysLocFormatter(%%physloc%%) AS RID FROM dbo.Product;

輸出範例:(1:34941:0)、(1:34941:1) → 第 1 檔案、34941 頁、Slot 0/1。
RID 驗證輸出

三、非叢集索引底層結構實測

建立測試資料

DROP TABLE dbo.Person;
CREATE TABLE Person (ID INT IDENTITY, NAME CHAR(900));  -- 900 bytes 接近索引鍵上限
CREATE INDEX idx_Person_Name ON dbo.Person(Name);

DECLARE @ch INT = 97;
WHILE @ch <= 122 BEGIN
    INSERT INTO dbo.Person VALUES (REPLICATE(CHAR(@ch), 5));  -- 'aaaaa', 'bbbbb'...
    SET @ch += 1;
END

DBCC IND 觀察頁面分佈

DBCC IND 頁面分佈

  • 4 個資料頁、5 個索引頁
  • Page 151 = IAM、Page 174 = 索引根頁、Page 173/121/126 = 索引葉頁

DBCC PAGE 解析葉頁 (Page 173, Option 1)

葉頁 Slot 0 內容

關鍵發現:

  1. 索引鍵有序:Slot 0,1... 對應 aaaaa, bbbbb...
  2. 記錄 = Key + RID:十六進位尾端 94000000 01000000 → PageID=0x94=148, FileID=1, Slot=0 = RID。
  3. 槽位表:8 筆記錄,Offset 遞增。

DBCC PAGE 解析中繼/根頁 (Page 174, Option 3)

根頁記錄

每筆記錄包含:Child Page MinKey + Child PageID + FileID,導航至下層頁面。

四、完整 B-Tree 結構圖解

非叢集索引 B-Tree 結構圖

五、查詢執行完整路徑

  1. 最佳化器決定走 idx_Person_Name。
  2. 2. 根頁 (Level 2) 依 Key 範圍導航至中繼頁 (Level 1)。 3. 中繼頁導航至葉頁 (Level 0)。 4. 葉頁二分搜尋找到 Name='jjjjj',取出 **RID**。 5. **RID Lookup** 直接定位堆表資料頁讀取完整列(含未在索引的欄位)。 6. 輸出結果。

六、覆蓋索引消除 RID Lookup

若查詢欄位全包含於索引鍵或 INCLUDE 欄位,**無需回基表**,執行計畫僅顯示 Index Seek,效能大幅提升。

CREATE INDEX idx_Person_Name_Cover ON dbo.Person(Name) INCLUDE (ID);  -- 或其他查詢欄位

總結

非叢集索引 = **有序 Key 陣列 + RID 指標**,B-Tree 導航 + RID Lookup 兩階段定位。理解 Key+RID 結構、善用 INCLUDE 建立覆蓋索引,是查詢調優核心技能。

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