Оператор Key Lookup инструкции Showplan

Оператор Key Lookup, появившийся в SQL Server 2005 с пакетом обновления 2 (SP2), выполняет поиск закладок в таблице с кластеризованным индексом. Столбец Аргумент содержит имя кластеризованного индекса и ключ кластеризации, который используется для поиска строки в кластеризованном индексе. Оператор Key Lookup всегда сопровождается оператором Nested Loops. Если в столбце Аргумент присутствует предложение WITH PREFETCH, обработчик запросов определяет, что оптимальным решением при поиске закладки в таблице или кластеризованном индексе будет применение асинхронной упреждающей выборки (упреждающего чтения). Дополнительные сведения об упреждающем чтении см. в разделе Считывание страниц.

В ранних версиях SQL Server 2005 функциональные возможности поиска закладки показаны оператором Clustered Index Seek с ключевым словом LOOKUP. В версии с пакетом обновления 2 (SP2) графический план выполнения выводит значок оператора Key Lookup, но если план выполнения отображается в XML-формате или текстовом формате, выводится оператор Clustered Index Seek с ключевым словом LOOKUP.

Использование оператора Key Lookup в плане запроса указывает, что запрос может выиграть от настройки производительности. Например, производительность запроса можно повысить, добавив покрывающий индекс.

Значок оператора Bookmark LookupЗначок графического плана выполнения

Примеры

Следующий пример выполняет простой запрос, изменяет некластеризованный индекс для покрытия запроса и повторно выполняет запрос, чтобы определить разницу в плане выполнения. Отобразив графический план выполнения для этого запроса, можно видеть, что в плане первого выполнения запроса оператор Key Lookup используется для получения данных GroupName из кластеризованного индекса в таблице HumanResources.Department.

В плане также показано, что некластеризованный индекс AK_Department_Name применяется для удовлетворения условий предложения WHERE предиката запроса. Изменив этот индекс, чтобы он включал столбец GroupName, можно сделать так, что индекс сможет покрыть запрос, поэтому план запроса содержит только операцию поиска. Время выполнения запроса значительно сокращено.

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