我正在尝试优化查找历史数据的查询。我正在使用查询分析器来查找执行计划,并发现我的大部分查询成本都在称为“书签查找”。我以前从未在执行计划中看过这个节点,也不知道它的含义。
在查询中这是好事还是坏事?
答案 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
上扫描索引,以获取从1
到10
的关键值,以及每个索引叶子,使用叶子中包含的指针来引用表本身,以找出col1
的值。
This article指出Bookmark Lookup
是SQL Server 2000
的字词,在NESTED LOOP
的索引和表格之间被SQL Server 2005
替换以上
答案 2 :(得分:2)
关于书签查询的MSDN:
Bookmark Lookup操作符使用a 书签(行ID或群集键)到 查找相应的行 表或聚簇索引。争论 列包含书签标签 用来查找表中的行 或聚集索引。争论 列还包含名称 表或聚簇索引中的 行被抬起头来。如果WITH PREFETCH 子句出现在Argument列中, 查询处理器已确定 使用异步是最佳的 在查看时预取(预读) 表中的书签或群集 索引。