萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> 資料庫綜合

SQL Server 非聚集索引深度解析:RID 查找、B+ 樹結構與覆蓋索引優化

現象:執行計畫中的「索引查找」與「RID 查找」

在 Product 表的 Name 欄建立非聚集索引,查詢計畫出現:

  • Index Seek (NonClustered):非聚集索引查找
  • RID Lookup:書籤查找,回堆表取資料

RID 是什麼? 為何非聚集索引需要它?

RID 本質:資料行的物理地址

RID = Row ID = (FileID : PageID : SlotID)

  • 資料頁內:槽位記錄偏移量 → 定位記錄
  • 跨頁面:PageID 定位頁面
  • 跨檔案:FileID 定位檔案

驗證函數:sys.fn_PhysLocFormatter(%%physloc%%) 可直接顯示 RID。
範例:(1:34941:0) = 檔案 1、頁面 34941、槽位 0。

非聚集索引 B+ 樹結構實測

測試環境建立

CREATE TABLE Person(ID INT IDENTITY, NAME CHAR(900));
CREATE INDEX idx_Person_Name ON dbo.Person(Name);
-- 插入 26 筆資料 (aaaaa... zzzzz),CHAR(900) 觸發多頁存儲

DBCC IND 觀察頁面分佈

4 個資料頁 + 5 個索引頁(含 1 個 IAM 根頁)。導出索引葉節點頁 (173):

  • 記錄類型:INDEX_RECORD
  • 每槽位包含:索引鍵值 + RID
  • 鍵值長度 900 字節,故每頁僅容納少量條目,形成多層 B+ 樹

非聚集索引查找全流程

  1. 從根頁開始,比較鍵值,導航至分支頁
  2. 最終到達葉節點,找到目標鍵值對應的 RID
  3. 拿著 RID 直接定位堆表資料頁、槽位,取回完整行資料(書籤查找)

關鍵優化:覆蓋索引消除 RID Lookup

若查詢只需索引鍵欄位 + 少量其他欄位,將這些欄位 INCLUDE 進非聚集索引:

CREATE INDEX idx_Name_Cover ON Product(Name) INCLUDE (Price, Category);

葉節點直接包含所需資料,省略 RID Lookup,查詢效能指數級提升。

非聚集索引 vs 聚集索引 回表差異

場景回表機制
堆表 + 非聚集索引RID Lookup (File:Page:Slot)
聚集索引表 + 非聚集索引Key Lookup (聚集鍵值) → 再走聚集索引 B+ 樹

總結

  • 非聚集索引葉節點存「鍵值 + 定位器 (RID/聚集鍵)」
  • RID 是堆表行的物理地址,聚集鍵是邏輯指標
  • 覆蓋索引是消除回表開銷的銀彈
  • 窄索引鍵 + INCLUDE 常用欄位 = 高性能非聚集索引設計模式
copyright © 萬盛學電腦網 all rights reserved