Execution Plan Operatoren
verstehen und bewerten
Seek, Scan, Lookup – was SQL Server im Hintergrund tut und wie man anhand dieser Operatoren Performance-Engpässe gezielt identifiziert.
Index Seek / Clustered Index Seek
SQL Server navigiert im B-Tree des Index direkt zu den gesuchten Schlüsselwerten. Anschließend werden die Blattseiten in der verlinkten Liste traversiert, um alle Treffer zu sammeln – nur die relevanten Seiten werden gelesen.
- WHERE-Bedingungen mit hoher Selektivität (
ID = 42) - Bereichsfilter auf indizierten Spalten (
BETWEEN,>=) - JOIN ON indizierte Spalten
Index Scan / Clustered Index Scan
Der gesamte Index wird sequenziell in der Reihenfolge seiner Blattseiten gelesen. Im Gegensatz zum Table Scan erfolgt der Zugriff geordnet – aber alle Einträge werden verarbeitet, unabhängig davon, wie viele Treffer die Abfrage letztlich liefert.
- Abfragen ohne oder mit schwach selektiver WHERE-Klausel
- ORDER BY entspricht exakt der Index-Reihenfolge (Scan statt Sort)
- Statistiken deuten darauf hin, dass ein Großteil der Zeilen benötigt wird
Key Lookup (Clustered)
Nach einem Zugriff über einen Non-Clustered Index fehlen Spalten, die nicht im Index enthalten sind. Für jede gefundene Zeile wird über den Primärschlüssel (Clustered Index) die vollständige Zeile aus der Basistabelle nachgeladen.
- Non-Clustered Index wird für die Suche genutzt
- Die SELECT-Liste oder WHERE-Bedingung enthält Spalten, die nicht im Index liegen
- Kein Covering Index vorhanden
INCLUDE, der alle benötigten Spalten enthält – dann entfällt der Lookup vollständig.
RID Lookup (Heap)
Das Gegenstück zum Key Lookup – aber auf einer Heap-Tabelle (ohne Clustered Index). Der Non-Clustered Index speichert als Zeiger eine RID (Row Identifier), bestehend aus Datei-, Seiten- und Zeilennummer. Mit dieser RID wird die Zeile direkt aus der Heap-Tabelle geholt.
- Zugriff über Non-Clustered Index auf eine Heap-Tabelle
- Nicht alle angeforderten Spalten sind im Index enthalten
- Tabelle hat keinen Clustered Index (Primary Key fehlt)
Table Scan
Die gesamte Tabelle wird – unabhängig von Indizes – vollständig und in physischer Speicherreihenfolge gelesen. Jede Zeile wird gegen die WHERE-Bedingung geprüft. Der Table Scan tritt nur bei Heap-Tabellen auf; hat die Tabelle einen Clustered Index, heißt die entsprechende Operation Clustered Index Scan.
- Kein nutzbarer Index vorhanden (Heap-Tabelle)
- WHERE-Bedingung nicht indizierbar (Funktion auf Spalte, Typkonvertierung)
- Optimizer entscheidet: Scan günstiger als viele Einzelzugriffe (sehr kleine Tabellen oder kaum selektive Filter)
Operatoren auf einen Blick
Die folgende Tabelle gibt einen Überblick über alle fünf Operatoren, ihre typische Performance-Bewertung und die häufigste Gegenmaßnahme bei Problemen.
| Operator | Zugriffsmuster | Tabellen-Typ | Bewertung | Gegenmaßnahme |
|---|---|---|---|---|
| Index Seek | Gezielt, B-Tree-Navigation | Mit CI oder NCI | Optimal | Residual Predicate prüfen |
| Index Scan | Sequenziell, vollständig | Mit CI oder NCI | Situationsabhängig | Selektivität der WHERE-Klausel erhöhen |
| Key Lookup | Einzelzugriff per PK | Mit Clustered Index | Kritisch bei vielen Zeilen | Covering Index mit INCLUDE |
| RID Lookup | Einzelzugriff per RID | Heap (kein CI) | Kritisch bei vielen Zeilen | Clustered Index anlegen |
| Table Scan | Vollständig, physisch | Heap (kein CI) | Warnsignal | Index anlegen, Abfrage prüfen |
Plan lesen in SSMS
In SQL Server Management Studio lässt sich der Execution Plan grafisch anzeigen. Bewegt man die Maus über einen Operator, erscheint ein Tooltip mit detaillierten Informationen:
| Tooltip-Feld | Bedeutung |
|---|---|
| Estimated Rows | Vom Optimizer auf Basis der Statistiken geschätzte Treffermenge |
| Actual Rows | Tatsächlich verarbeitete Zeilen (nur im tatsächlichen Plan) |
| Seek Predicate | Bedingung, die direkt über den B-Tree navigiert – effizient |
| Predicate | Filter, der auf Blattebene nach dem Seek ausgewertet wird – Residual Predicate, kann teuer sein |
| Output List | Spalten, die der Operator an den nächsten Schritt weitergibt |
| Estimated Subtree Cost | Relative Kosten des Operators und seiner Kinder – Grundlage für die Pfeildickendarstellung |