Key Lookup Showplan 运算符

SQL Server 2005 Service Pack 2 中引入的 Key Lookup 运算符是在具有聚集索引的表上进行的书签查找。Argument 列包含聚集索引的名称和用来在聚集索引中查找行的聚集键。Key Lookup 通常带有 Nested Loops 运算符。如果 Argument 列中出现 WITH PREFETCH 子句,则表示查询处理器已决定在聚集索引内查找书签时将使用异步预提取(预读)作为最佳选择。有关预读的详细信息,请参阅读取页

在早期版本的 SQL Server 2005 中,可以使用带有关键字 LOOKUP 的 Clustered Index Seek 运算符来显示书签查找功能。在 SP2 中,Key Lookup 运算符图标显示在图形执行计划中,但是,以 XML 或文本格式显示执行计划时,输出将显示带有关键字 LOOKUP 的 Clustered Index Seek 运算符。

在查询计划中使用 Key Lookup 运算符表明该查询可能会从性能优化中获益。例如,添加涵盖索引可能会提高查询性能。

Bookmark Lookup 运算符图标图形执行计划图标

示例

以下示例将运行一个简单查询并修改非聚集索引来涵盖查询,然后重新运行该查询以观察查询执行计划的差异。通过显示该查询的图形执行计划,您可以看到针对查询的第一次执行计划将显示 Key Lookup 运算符用于从 HumanResources.Department 表的聚集索引中检索 GroupName 数据。

该计划还显示非聚集索引 AK_Department_Name 用于满足该查询的 WHERE 子句谓词的需求。通过将索引修改为包含 GroupName 列,该索引可以涵盖查询并且索引计划仅包含索引查找操作。这样执行查询的时间会显著减少。

USE AdventureWorks;
GO
SELECT GroupName
FROM HumanResources.Department
WHERE Name = 'Engineering';
GO
-- Create a covering index by adding GroupName to the nonclustered index.
USE AdventureWorks;
GO
CREATE UNIQUE NONCLUSTERED INDEX AK_Department_Name
    ON HumanResources.Department ( Name ASC, GroupName)
    WITH (DROP_EXISTING = ON);
GO
USE AdventureWorks;
GO
SELECT GroupName
FROM HumanResources.Department
WHERE Name = 'Engineering';
GO