2 Interne Verarbeitung von Abfragen
Um besser einzuschätzen zu können, an welchen Stellen eine Abfrageoptimierung erfolgversprechend ist, hilft es zu wissen, wie SQL-Abfragen im Detail intern verarbeitet werden.
2.1 Ablauf der Abfrageverarbeitung
Bevor eine Abfrage ausgeführt wird, erstellt SQL Server einen Ausführungsplan, in dem festgelegt wird, wie auf die beteiligten Tabellen zugegriffen wird. Genau genommen geschieht dies in drei Schritten, bei denen verschiedene Komponenten beteiligt sind.
- Der so genannteParser prüft die Syntax der SQL-Anweisung und erstellt einen grobenAusführungsbaum.
- DerAlgebrizer erledigtähnliche Aufgaben wie der Parser, geht hierbei jedoch einen Schritt weiter, da nun auch die vorhandenen Datenstrukturen der von der Abfrage verwendeten Datenbankobjekte berücksichtigt werden. So werden einerseits die Namen von Tabellen und Spalten geprüft, aber auch die Korrektheit der dazugehörigen Datentypen. Als Ergebnis des Algebrizers wird der logische Ausführungsbaum weiter optimiert und alsSyntaxbaum imPlan-Cache gespeichert (der Plan-Cache wird weiter hinten in diesem Kapitel ausführlicher behandelt).
- DerOptimizer (dt.:Optimierer) schließlich erstellt den eigentlichen Ausführungsplan, der die Art und Reihenfolge des Zugriffs auf die beteiligten Tabellen regelt. Auch dieser Ausführungsplan wird im Plan-Cache gespeichert.
Dieses Vorgehen greift bei der Verarbeitung von Ad-hoc-Abfragen, parametrisierten Abfragen und sogar gespeicherten Prozeduren. Im Allgemeinen ist die oben dargestellte Dreiteilung nicht so relevant. Der wesentliche Punkt ist die Tatsache, dass der Optimierer einen Ausführungsplan erstellt, in dem festgelegt wird, wie die Abfrage intern ausgeführt wird.
Dabei werden die einzelnen Klauseln einer SQL-Abfrage in folgender Reihenfolge abgehandelt:
- FROM bestimmt, welche Tabellen gelesen und wie sie miteinander verknüpft werden
- WHERE filtert die Tabellen zeilenweise aufgrund von Bedingungen
- GROUP BY fasst Zeilen des Zwischenergebnisses zusammen
- HAVING filtert die Zeilen des Zwischenergebnisses anhand von Bedingungen
- SELECT wählt die als Ergebnis zurückzugebenden Spalten aus
- ORDER BY sortiert die Ergebniszeilen
- TOP/OFFSET reduziert die Ergebnismenge auf eine bestimmte Anzahl von Zeilen (bei Verwendung vonOFFSET ab einer bestimmten Position)
Auffällig ist dabei, dass dies nicht ganz der Reihenfolge entspricht, in der die einzelnen Klauseln in einer SQL-Abfrage angegeben werden. So werden die einzelnen Spalten, deren Daten gelesen werden, bei der Abfrage zwar gleich am Anfang angegeben, bei der Ausführung aber erst im vorletzten Schritt berücksichtigt.
Hinweis: Etwas logischer ist dies in der Abfragesyntax der Abfragesprache LINQ gestaltet. Hier werden die Klauseln in der ReihenfolgeFROM,WHERE,ORDER BY,SELECT aufgeführt, was schon eher der Auswertungsreihenfolge entspricht und insbesondere verbesserte Möglichkeiten für die Eingabeunterstützung mittels IntelliSense im Code-Editor bietet.Ähnlich verhält es sich bei den in XQuery verwendeten FLWOR-Ausdrücken. Diese werden– entsprechend der Abkürzung– in der ReihenfolgeFOR,LET,WHERE,ORDER BY,RETURN ausgewertet. Wenn man sich hier die letzten drei Bestandteile anschaut, wird zuerst die Menge der Zeilen mitWHERE gefiltert, dann mitORDER BY sortiert und schließlich werden mitRETURN die zurückzugebenden Werte definiert.
2.2 Ausführungspläne
Im SQL Server Management Studio kann man sich den Ausführungsplan zu einer Abfrage anzeigen lassen. Dabei wird zwischen dem geschätzten und realen Ausführungsplan unterschieden.
Der geschätzte Ausführungsplan wird angezeigt, ohne dass die Abfrage wirklich ausgeführt wird. Dazu wählen Sie im Management Studio den MenüpunktAbfrage |Geschätzten Ausführungsplananz