von Markus Winand.

Operationen in SQL Server Ausführungsplänen


Die Referenz in der Microsoft Dokumentation: http://technet.microsoft.com/de-de/library/ms191158.aspx

Index- und Tabellenzugriffe

Die Operationsnamen folgen bei SQL Server einem einfachen Schema. Alle „Scan“-Operationen lesen den gesamten Index oder die gesamte Tabelle. Die „Seek“-Operationen benutzen den Index-Baum oder die physikalische Adresse (RID, wie die Oracle ROWID), um auf einen Bereich gezielt zuzu­grei­fen.

Index Seek, Clustered Index Seek

Die Operation Index Seek durchwandert den Indexbaum und folgt anschließend der Blattknoten-Liste, um alle Treffer zu finden (analog zu einem INDEX RANGE SCAN in der Oracle Datenbank). Siehe Kapitel 1, „Anatomie eines SQL Indexes.

Die sogenannten Index-Filterprädikate sind ein häufiges Performance­pro­blem bei der Index Seek-Operation. SQL Server Zugriffs- und Filterprädikate unterscheiden erklärt, wie man sie identifiziert.

Index Scan, Clustered Index Scan

Liest den ganzen Index – alle Zeilen – in der Index-Reihenfolge. Diese Operation kann zum Beispiel dann benutzt werden, wenn alle Zeilen in der entsprechenden Reihenfolge benötigt werden – z. B., weil die order by-Klausel der Indexdefinition entspricht. Siehe Kapitel 6, „Sortieren und Gruppieren.

Key Lookup (Clustered)

Lädt eine Zeile aus einem Clustered-Index. Ähnlich einem INDEX UNIQUE SCAN auf einer Index-Organized-Table (IOT) bei der Oracle Datenbank. Siehe auch Kapitel 5, „Daten-Cluster.

RID Lookup (Heap)

Lädt eine Tabellenzeile anhand der RID aus einer vorangegangenen Index-Operation. Ähnlich der Operation TABLE ACCESS BY INDEX ROWID bei der Oracle Datenbank. Siehe Kapitel 1, „Anatomie eines SQL Indexes.

Table Scan

Liest die ganze Tabelle – alle Zeilen – wie gespeichert. Das heißt, in „zufälliger“ Reihenfolge. Obwohl die Blöcke nicht einzeln, sondern mehrere auf einmal gelesen werden, gehört der Table Scan zu den teuersten Operationen überhaupt. Neben der Last am Speichersystem ist er auch sehr CPU-intensiv, da alle Tabellenzeilen gegen die where-Klausel geprüft werden müssen. Analog zu TABLE ACCESS FULL bei der Oracle Datenbank. Siehe Full-Table-Scan.

Hinweis in eigener Sache

Ich biete Schulungen, Optimierung und Beratung an. Auch der Kauf meines Buches „SQL Performance Explained“ (ab €9,95) unterstützt meine Arbeit an dieser Webseite.

Join-Operationen

Join-Operationen verbinden grundsätzlich nur zwei Tabellen auf einmal. Falls mehrere Join-Operationen in einer Abfrage vorkommen, werden sie schrittweise durchgeführt; zuerst zwei Tabellen, dann das Zwischen­er­geb­nis mit der nächsten. Insofern kann der Begriff „Tabelle“ im Folgenden auch ein Zwischenergebnis bezeichnen.

Nested Loops

Verbindet zwei Tabellen, indem es für jede Zeile aus der ersten Tabelle eine Abfrage auf die zweite macht. SQL Server nutzt den Nested-Loops Join auch für den Tabellenzugriff nach einem Indexzugriff. Siehe Nested Loops – verschachtelte Schleifen.

Hash Match

Ein Hash-Join lädt die möglicherweise passenden Zeilen aus der einen Tabelle in ein assoziatives Array (Hash-Table), das dann für jede Zeile der zweiten Tabelle abgefragt wird. Siehe Hash-Join.

Merge Join

Der Merge-Join verbindet zwei Tabellen wie ein Reißverschluss. Beide Tabellen müssen vorsortiert sein. Siehe Sort-Merge.

Sortieren und Gruppieren

Sort

Sortiert das Ergebnis entsprechend der order by-Klausel. Diese Operation benötigt Speicher, um das Ergebnis zwischenzuspeichern (keine pipelined execution). Siehe auch ORDER BY indizieren.

Sort (Top N Sort)

Sortiert ein Teilergebnis entsprechend der order by-Klausel. Diese Operation wird für Top-N-Abfragen genutzt, die nicht „am Fließband“ ausgeführt werden können. Siehe Top-N-Zeilen abfragen.

Stream Aggregate

Gruppiert ein vorsortiertes Ergebnis entsprechend der group by-Klausel. Die Ausführung erfolgt „am Fließband“. Falls der Operation aber ein Sort vorausgeht, erfolgt dieses nicht „am Fließband“. Siehe GROUP BY indizieren.

Hash Match (Aggregate)

Führt eine Gruppierung mit einer Hash-Tabelle durch. Diese Operation benötigt Speicher zum Materialisieren des Zwischenergebnisses (keine Ausführung „am Fließband“). Die Ausgabe erfolgt in keiner bestimmten Reihenfolge. Siehe GROUP BY indizieren.

Top-N-Abfragen

Top

Bricht die Ausführung ab, sobald die gewünschte Anzahl an Zeilen gefunden wurde. Siehe Top-N-Zeilen abfragen.

Die Effizienz einer Top-N-Abfrage hängt vom den abgebrochenen Operationen ab. Es ist sehr ineffizient, Operationen abzubrechen, die nicht „am Fließband“ ausgeführt werden (z. B. Sort).

Über den Autor

Foto von Markus Winand

Markus Winand gibt auf modern-sql.com Einblick in SQL und zeigt, wie es von verschiedenen Systemen unterstützt wird. Zuvor machte er use-the-index-luke.com, was er noch immer wartet. Markus kann als Trainer, Sprecher und Berater auf winand.at engagiert werden.

Sein Buch kaufen

Titelbild von „SQL Performance Explained“: Eichhörnchen läuft durchs Grass

Die Essenz: SQL-Tuning auf 200 Seiten

Jetzt Kaufen
(Taschenbuch und/oder PDF)

Sein Training

Markus verwandelt veraltetes SQL-92-Wissen in solides und zeitgemäßes SQL-Know-how

Erfahren Sie mehr»

Nicht mit OFFSET blättern

Mehr info

Besuche meine Schwester-Seite!Seit SQL-92 hat sich einiges getan!

Die Use The Index, Luke! Tasse

Aufkleber, Bierdeckel, Bücher und Kaffeetassen. Alles was man beim Lernen braucht!

Zum Shop

Mit Markus Winand verbinden

Markus Winand auf LinkedInMarkus Winand auf XINGMarkus Winand auf Twitter
„Use The Index, Luke!“ von Markus Winand ist unter einer Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License lizenziert.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz und DSGVO | CC-BY-NC-ND 3.0 Lizenz