[SQL SERVER]書籤查閱是什麼

這是我課程上的一個小議題,下課休息時間,有學員詢問我書籤查閱(bookmark lookup)是什麼?

而該學員第一個問題是索引建值和欄位關係,而這些是我課程索引設計優化主題中的索引設計基本概念議題之一,

現在我就來簡單說明書籤查閱是什麼。

我假設大家已經知道索引建值和欄位關係,我用non-heap範例簡單說明。

create table bookmark

(

c1 int not null primary key clustered

,c2 varchar(10)

,c3 date

,c4 bit

)

create index idx1 on bookmark(c2) include(c4)

select c3 from bookmark with(index(idx1)) where c2='test1'

圖形執行計畫可以看到索引鍵(key/bookmark)查閱,文字執行計畫則有Lookup關鍵字。

從執行計畫看出,該查詢需要c3欄位資料,但使用索引idx1搜尋並不會返回c3欄位資料,QO為了快速解決這問題,

於是從clustered index讀取每筆資料列缺少的c3欄位,並在clustered index上查閱該c3欄位值,這樣的過程就稱為書籤查閱(bookmark lookup)。

而書籤(bookmark)是一個指標(pointer),並指向clustered index資料列,而索引idx1每筆資料列都會儲存該bookmark(先天特性),

所以我們永遠可以從索引idx1找到對應基礎資料表上的資料,如下圖

我相信你應該了解書籤查閱,那這運算子會產生什麼影響?我們又應該注意或評估什麼?

參考

Bookmark Lookup Showplan 運算子