在 Product 表的 Name 欄建立非聚集索引,查詢計畫出現:
RID 是什麼? 為何非聚集索引需要它?
RID = Row ID = (FileID : PageID : SlotID)
PageID 定位頁面FileID 定位檔案驗證函數:sys.fn_PhysLocFormatter(%%physloc%%) 可直接顯示 RID。
範例:(1:34941:0) = 檔案 1、頁面 34941、槽位 0。
CREATE TABLE Person(ID INT IDENTITY, NAME CHAR(900));
CREATE INDEX idx_Person_Name ON dbo.Person(Name);
-- 插入 26 筆資料 (aaaaa... zzzzz),CHAR(900) 觸發多頁存儲
4 個資料頁 + 5 個索引頁(含 1 個 IAM 根頁)。導出索引葉節點頁 (173):
INDEX_RECORD若查詢只需索引鍵欄位 + 少量其他欄位,將這些欄位 INCLUDE 進非聚集索引:
CREATE INDEX idx_Name_Cover ON Product(Name) INCLUDE (Price, Category);
葉節點直接包含所需資料,省略 RID Lookup,查詢效能指數級提升。
| 場景 | 回表機制 |
|---|---|
| 堆表 + 非聚集索引 | RID Lookup (File:Page:Slot) |
| 聚集索引表 + 非聚集索引 | Key Lookup (聚集鍵值) → 再走聚集索引 B+ 樹 |