SQL Server-Pläne: Unterschied zwischen Index-Scan und Index-Suche

87

Was ist in einem SQL Server-Ausführungsplan der Unterschied zwischen einem Index-Scan und einem Index-Suchvorgang?

Ich bin auf SQL Server 2005.

cindi
quelle

Antworten:

128

Bei einem Index-Scan liest SQL Server den gesamten Index nach Übereinstimmungen. Die dafür erforderliche Zeit ist proportional zur Größe des Index.

Bei einer Indexsuche verwendet SQL Server die B-Tree-Struktur des Index, um direkt nach übereinstimmenden Datensätzen zu suchen ( eine Vorstellung davon, wie dies funktioniert, finden Sie unter http://mattfleming.com/node/192 ). Die benötigte Zeit ist nur proportional zu die Anzahl der übereinstimmenden Datensätze.

  • Im Allgemeinen ist eine Indexsuche einer Indexsuche vorzuziehen (wenn die Anzahl der übereinstimmenden Datensätze proportional viel geringer ist als die Gesamtzahl der Datensätze), da die für die Durchführung einer Indexsuche benötigte Zeit unabhängig von der Gesamtzahl der Datensätze in Ihrem Datensatz konstant ist Tabelle.
  • Beachten Sie jedoch, dass ein Index-Scan in bestimmten Situationen schneller sein kann als eine Index-Suche (manchmal erheblich schneller) - normalerweise, wenn die Tabelle sehr klein ist oder wenn ein großer Prozentsatz der Datensätze mit dem Prädikat übereinstimmt.
Justin
quelle
3
Ist der Link noch aktiv? bei mir funktioniert es nicht Bitte helfen Sie, wenn es einen aktualisierten Link gibt
Ronak Agrawal
2
@ RonakAgrawal Sieht aus wie der Link tatsächlich tot ist - vielleicht stattdessen Wikipedia überprüfen ?
Justin
76

Die Grundregel lautet: Scans sind schlecht, Suchvorgänge sind gut.

Index-Scan

Wenn SQL Server einen Scan durchführt, lädt es das Objekt, das von der Festplatte gelesen werden soll, in den Speicher und liest dieses Objekt dann von oben nach unten durch, um nach den benötigten Datensätzen zu suchen.

Index suchen

Wenn SQL Server eine Suche durchführt, weiß es, wo sich die Daten im Index befinden werden. Daher lädt es den Index von der Festplatte, wechselt direkt zu dem Teil des Index, den es benötigt, und liest dahin, wo die benötigten Daten enden . Dies ist offensichtlich eine viel effizientere Operation als ein Scan, da SQL bereits weiß, wo sich die gesuchten Daten befinden.


Wie kann ich einen Ausführungsplan so ändern, dass anstelle eines Scans ein Suchvorgang verwendet wird?

Wenn SQL Server nach Ihren Daten sucht, ist es wahrscheinlich eines der größten Probleme, dass SQL Server von einer Suche zu einem Scan wechselt, wenn einige der gesuchten Spalten nicht in dem Index enthalten sind, den Sie verwenden möchten. In den meisten Fällen greift SQL Server auf einen Clustered-Index-Scan zurück, da der Clustered-Index alle Spalten in der Tabelle enthält. Dies ist einer der Hauptgründe (zumindest meiner Meinung nach), dass wir jetzt die Möglichkeit haben, Spalten in einen Index aufzunehmen, ohne diese Spalten zu den indizierten Spalten des Index hinzuzufügen. Indem wir die zusätzlichen Spalten in den Index aufnehmen, erhöhen wir die Größe des Index, erlauben SQL Server jedoch, den Index zu lesen, ohne zum Clustered-Index oder zur Tabelle selbst zurückkehren zu müssen, um diese Werte abzurufen.

Verweise

Informationen zu den Besonderheiten jedes dieser Operatoren in einem SQL Server-Ausführungsplan finden Sie unter ....

John Sansom
quelle
7

Kurze Antwort:

  • Index-Scan: Berühren Sie alle Zeilen außer bestimmten Spalten.

  • Indexsuche: Berühren Sie bestimmte Zeilen und Spalten.

Große Augen
quelle
4

Bei einem Index-Scan werden alle Zeilen im Index gescannt, um eine passende Zeile zu finden. Dies kann für kleine Tische effizient sein. Bei einer Indexsuche müssen nur die Zeilen berührt werden, die tatsächlich die Kriterien erfüllen, und daher ist sie im Allgemeinen leistungsfähiger

AdaTheDev
quelle
2

Ein Index-Scan wird durchgeführt, wenn die Indexdefinition nicht in einer einzelnen Zeile gefunden werden kann, um Suchprädikate zu erfüllen. In diesem Fall muss SQL Server mehrere Seiten scannen , um einen Zeilenbereich zu finden , der die Suchprädikate erfüllt.

Bei einer Indexsuche findet SQL Server mithilfe der Indexdefinition ein einzelnes Zeilenübereinstimmungs-Suchprädikat .

Indexsuchen sind besser und effektiver.

Kevchadders
quelle
0

Ein Scan berührt jede Zeile in der Tabelle, auch wenn es das ist, wonach Sie suchen oder nicht

Bei einer Suche werden nur die Zeilen angezeigt, nach denen Sie suchen.

Suchanfragen sind immer besser als Scans, da sie die Art und Weise, wie Daten nachgeschlagen werden, effizienter gestalten.

Eine gute Erklärung finden Sie hier

AutomatedTester
quelle
3
Suchvorgänge sind nicht immer besser. Wenn beispielsweise die Tabelle relativ klein ist und ein großer Prozentsatz der Zeilen in dieser Tabelle zurückgegeben werden muss, kann ein Index-Scan viel effizienter sein.
Justin
1
Hallo Justin, ich denke du willst sagen, dass Tischscans manchmal besser sein können. Indexsuche ist immer besser als ein Index-Scan, es sei denn, es handelt sich um Clustered. Manchmal kann ein Tabellenscan oder ein Clustered Index Scan aus dem von Ihnen genannten Grund effizienter sein. Anstatt den Index zu suchen und abzurufen, dass die Felder nicht im Index der Tabelle enthalten sind, verwendet ms sql manchmal die Tabelle, auch wenn der Index das Kriterienfeld enthält.
Jose Areas