2009-05-04 18 views
17

我正在嘗試優化查詢歷史數據的查詢。我正在使用查詢分析器來查找執行計劃,並發現大部分查詢成本都在一個名爲「書籤查找」的東西上。我從來沒有在執行計劃中看到過這個節點,也不知道它的含義。什麼是Sql Server中的書籤查找?

這是查詢中的好事還是壞事?

回答

28

書籤查找是基於在非聚集索引中找到的條目查找SQL表中的實際數據的過程。

當您搜索非聚集索引中的值,並且您的查詢需要比索引葉節點(所有索引字段以及任何可能的INCLUDE列)的一部分更多的字段時,SQL Server需要去檢索實際的數據頁面 - 這就是所謂的書籤查找。

在某些情況下,這確實是唯一的方法 - 只有當您的查詢只需要一個字段(不是一大堆'em')時,INCLUDE字段可能是一個好主意,聚簇索引。在這種情況下,非聚集索引的葉級節點將包含滿足查詢所需的所有字段(「覆蓋」索引),因此不再需要書籤查找。

馬克

+2

同意。如果返回大部分表格,最好只是進行表格掃描,但如果統計數據不佳,您可能會收到一個計劃,用於完成書籤查找。有一個相當不錯的免費電子書在執行計劃在redgate - http://www.red-gate.com/specials/Grant.htm – ahains 2009-05-04 16:16:48

+1

是的,紅門網站是很多偉大的SQL Server的東西可用 - 很多它的免費的! – 2009-05-04 16:18:01

3

這是一個NESTED LOOP其加入與表本身上一個行指針非聚集索引。

發生都有這樣的疑問:

SELECT col1 
FROM table 
WHERE col2 BETWEEN 1 AND 10 

,如果你有col2的索引。

col2上的索引包含指向索引行的指針。

因此,爲了檢索的col1的值時,發動機需要掃描上col21密鑰值的索引10,並且對於每個索引葉,是指使用包含在該指針表本身葉,找出col1的價值。

This article指出一個Bookmark LookupSQL Server 2000的術語,它是由NESTED LOOP'代替索引和表之間S IN SQL Server 2005和上述

2

MSDN關於書籤查找:

的書籤查找運算符使用 書籤(行ID或集羣鍵)到 查找 表或聚簇索引中的對應行。參數 列包含用於查找表 或聚簇索引中的行的書籤標籤 。參數 列還包含 表格或聚簇索引的名稱,其中查找了 行。如果WITH PREFETCH 子句出現在Argument列, 查詢處理器已經確定 ,這是最佳的使用異步 預取看在表 向上書籤或聚簇索引 時(預讀)。