2016年11月22日 星期二

SQL SEVER 的RID查閱(RID Lookup)


(以下係以 SQL SRVER 2012 為例)
....
之前在SQL SERVER的 RowID這篇文中曾提到;
當我們查看執行計畫時,經常會看到一個「RID查閱」,它的意思是索引中沒有完全涵蓋所需要的欄位,所以需要從索引中經由RID指向至來源TABLE(Heap)中的某筆紀錄,以取得所需欄位資料。













舉個例子來看:

首先建立一個Table(testtbl),並建立一個non clustered index(idx1)
create table testtbl(c1 int identity,c2 int,c3 varchar(1000))
go
create index idx1 on testtbl(c1)
go
接著對它新增1000筆資料……..

上面的 index (idx1),只針對 C1 這個欄位建立。值得注意的是,當來源 Table 是 Heap 時,所有 index 都會在 [keys] 之後,由系統自動增加一個 [HEAP RID] 欄位在最後,若用語法來說明,相當於:
create index idx1 on testtbl(c1,HEAP RID)   --這是示意,語法不能這樣下

我們透過dbcc來查看一下索引的分葉層頁面,可以看到在 C1(key)之後,系統自動新增了一個HEAP RID (key) 










執行select查詢
select c1,c2,c3 from testtbl where c1=453

這句查詢會走 idx1 的索引搜尋,但由於 idx1 中,只有 C1 欄位的資料,沒有 C2,C3 的資料,而 select 要求的是 C1,C2,C3;這時候系統就會透過 index 中的 HEAP RID,快速指向來源table(testtbl)的對應的 row 的實體位址,取得 C2,C3 的資料。這樣的動作即是「RID查閱」。

RID查閱,是針對 Heap Table 的。如果是 Clustered Table,不會有RID查閱,取而代之的是「索引鍵查閱」。













有關索引鍵查閱,待下一篇文章再詳談..

沒有留言:

張貼留言