Operatore Showplan Key Lookup

Introdotto in SQL Server 2005 Service Pack 2, l'operatore Key Lookup implementa la funzionalità di ricerca tramite segnalibro per le tabelle con un indice cluster. La colonna Argument contiene il nome dell'indice cluster e la chiave di clustering utilizzata per la ricerca della riga nell'indice cluster. L'operatore Key Lookup è sempre utilizzato in combinazione con un operatore Nested Loops. Se nella colonna Argument viene visualizzata la clausola WITH PREFETCH, ciò indica che Query Processor considera ottimale l'utilizzo della prelettura asincrona (read-ahead) per la ricerca di segnalibri nell'indice cluster. Per ulteriori informazioni sul read-ahead, vedere Lettura di pagine.

Nelle versioni precedenti di SQL Server 2005, la funzionalità di ricerca tramite segnalibro è disponibile mediante l'utilizzo dell'operatore Clustered Index Seek con la parola chiave LOOKUP. In SP2, nel piano di esecuzione grafico viene visualizzata l'icona dell'operatore Key Lookup. Se il piano di esecuzione viene visualizzato in formato XML o testo, tuttavia, l'output mostra l'operatore Clustered Index Seek con la parola chiave LOOKUP.

L'utilizzo di un operatore Key Lookup in un piano di query indica che l'ottimizzazione delle prestazioni potrebbe consentire di ottenere risultati migliori per la query. Le prestazioni della query, ad esempio, potrebbero essere migliorate con l'aggiunta di un indice di copertura.

Icona dell'operatore Bookmark LookupIcona del piano di esecuzione grafico

Esempi

Nell'esempio seguente viene eseguita una query semplice, viene modificato un indice non cluster per la copertura della query, quindi la query viene rieseguita per esaminare le differenze nel piano di esecuzione. Se si visualizza il piano di esecuzione grafico per questa query, si potrà notare che il piano per la prima esecuzione della query indica l'utilizzo dell'operatore Key Lookup per il recupero dei dati GroupName dall'indice cluster nella tabella HumanResources.Department.

Il piano indica inoltre che l'indice non cluster AK_Department_Name viene utilizzato per soddisfare il predicato della clausola WHERE della query. La modifica dell'indice per includere la colonna GroupName consente la copertura della query e il piano di query contiene solo un'operazione di ricerca nell'indice. In questo modo, il tempo di esecuzione della query viene notevolmente ridotto.

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