2009-09-08 10 views
43

Ich weiß, dass ein Index suchen ist besser als ein Index Scan, die aber in SQL Server vorzuziehen ist, erklären Pläne: Index suchen oder Key Lookup (Lesezeichen in SQL Server 2000)?Was ist besser: Lesezeichen/Key Lookup oder Index Scan

Bitte sagen Sie mir, dass sie den Namen nicht mehr ändern für SQL Server 2008 ...

+1

der Inhalt der Frage fragt eine Sache und der Titel eine andere Sache .... – Peter

Antwort

47

Index suchen, jedes Mal.

Suchvorgänge sind teuer, daher werden Indizes abgedeckt und speziell die INCLUDE-Klausel hinzugefügt, um sie besser zu machen.

Wenn Sie beispielsweise genau eine Zeile erwarten, kann ein Suchvorgang gefolgt von einem Suchvorgang besser sein als der Versuch, eine Abfrage abzudecken. Wir verlassen uns darauf, um in bestimmten Situationen einen weiteren Index zu vermeiden.

Edit: Einfach reden Artikel: Using Covering Indexes to Improve Query Performance

bearbeiten, August 2012

Lookups passieren pro Zeile, weshalb sie schlecht skalieren. Letztendlich wählt der Optimierer statt eines seek + lookup einen Clustered-Index-Scan, weil er effizienter ist als viele Nachschlagevorgänge.

+1

+1 für die Abdeckung von Indizes und der Simple-Talk-Link (ausgezeichnete Sachen) –

2

This SO question erwähnt, dass Schlüsselsuchen etwas zu vermeiden sind. Eine Index-Suche wird definitiv die bessere Leistung sein.

8

Key lookup ist sehr ähnlich wie ein Clustered-Index-Suche (vor 2005 SP2 wurde mit der Suche nach "suchen") benannt. Ich denke, der einzige Unterschied besteht darin, dass das Schlüssel-Lookup ein zusätzliches PRE-FETCH-Argument angeben kann, das die Ausführungs-Engine anweist, mehr Schlüssel im Cluster vorzulesen (dh einen Clustered-Index-Suchlauf gefolgt von einem Suchlauf durchzuführen).

Eine Schlüsselsuche sollte Sie nicht erschrecken. Wird der normale Operator in geschachtelten Schleifen verwendet, und verschachtelte Schleifen ist der normale Join-Operator. Wenn Sie einen Plan verbessern möchten, versuchen Sie, den Join zu verbessern und zu prüfen, ob er stattdessen einen Merge-Join verwenden kann (dh beide Seiten des Joins können Zeilen in der gleichen Schlüsselreihenfolge, schnellsten Join bereitstellen) oder einen Hash-Join Speicher für das QO, um einen Hash-Join zu berücksichtigen oder die Kardinalität zu reduzieren, indem Zeilen vor dem Join statt nach dem Filter gefiltert werden.

+1

bist du sicher ... eine Schlüsselnachschlage ist ein Lesezeichen Nachschlagen = teuer, nein? – gbn

+1

afaik ist genau so teuer wie ein Suchvorgang, es überträgt sich auf die gleiche physische Operation. Die * Präsenz * von Nachschlagen weist jedoch auf * potentielle * Probleme wie Slonon-abdeckende Indizes hin. Beachten Sie, dass ein Lookup * mit Joins * besser ist als ein Suchvorgang, da Nachschlagevorgänge Pre-Fetch angeben können. –

+0

'Slonon-konvertierende Indizes' =>' langsame Verknüpfungen oder nicht abdeckende Indizes' (Typo) –