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 zuzugreifen.
- 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 einemINDEX RANGE SCAN
in der Oracle Datenbank). Siehe Kapitel 1, „Anatomie eines SQL Indexes“.Die sogenannten Index-Filterprädikate sind ein häufiges Performanceproblem 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 OperationTABLE 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 diewhere
-Klausel geprüft werden müssen. Analog zuTABLE 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 Zwischenergebnis 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 einSort
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
).