什么是Sql Server中的书签查找?

时间:2009-05-04 16:04:29

标签: sql-server performance optimization indexing

我正在尝试优化查找历史数据的查询。我正在使用查询分析器来查找执行计划,并发现我的大部分查询成本都在称为“书签查找”。我以前从未在执行计划中看过这个节点,也不知道它的含义。

在查询中这是好事还是坏事?

3 个答案:

答案 0 :(得分:29)

书签查找是根据非聚集索引中的条目在SQL表中查找实际数据的过程。

当您在非聚集索引中搜索值时,您的查询需要的字段多于索引叶节点的一部分(所有索引字段以及任何可能的INCLUDE列),那么SQL Server需要检索实际的数据页面 - 这就是所谓的书签查找。

在某些情况下,这真的是唯一的出路 - 只有当你的查询只需要一个字段(而不是一大堆'em)时,在非集群中包含该字段可能是个好主意。指数。在这种情况下,非聚集索引的叶级节点将包含满足查询所需的所有字段(“覆盖”索引),因此不再需要书签查找。

马克

答案 1 :(得分:4)

它是一个NESTED LOOP,它将一个非聚集索引与表本身连接在一个行指针上。

发生这样的查询:

SELECT  col1
FROM    table
WHERE   col2 BETWEEN 1 AND 10

,如果您在col2上有索引。

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

因此,为了检索col1的值,引擎需要在col2上扫描索引,以获取从110的关键值,以及每个索引叶子,使用叶子中包含的指针来引用表本身,以找出col1的值。

This article指出Bookmark LookupSQL Server 2000的字词,在NESTED LOOP的索引和表格之间被SQL Server 2005替换以上

答案 2 :(得分:2)

关于书签查询的MSDN

  

Bookmark Lookup操作符使用a   书签(行ID或群集键)到   查找相应的行   表或聚簇索引。争论   列包含书签标签   用来查找表中的行   或聚集索引。争论   列还包含名称   表或聚簇索引中的   行被抬起头来。如果WITH PREFETCH   子句出现在Argument列中,   查询处理器已确定   使用异步是最佳的   在查看时预取(预读)   表中的书签或群集   索引。