: Robert Panther
: SQL-Abfragen optimieren Was Entwickler über Performance wissen müssen
: entwickler.press
: 9783868026504
: 1
: CHF 8.90
:
: Informatik
: German
: 176
: Wasserzeichen/DRM
: PC/MAC/eReader/Tablet
: ePUB/PDF
SQL-basierte Datenbanken bilden das Rückgrat für nahezu jede Businessanwendung. Kritischer Faktor ist dabei oft die Performance der Datenbankzugriffe. Dieses Buch erklärt in kompakter Form am Beispiel von Microsoft SQL Server, wie man performante SQL-Abfragen formuliert. Dabei wird auch auf die verschiedenen Möglichkeiten hingewiesen, die verschiedene Versionen des Produkts (bis hin zu SQL Server 2014) bieten. Viele Optimierungsansätze sind jedoch auch auf SQL-basierte Datenbank-Management-Systeme anderer Hersteller anwendbar. Somit erhält jeder, der selbst SQL-Abfragen schreibt - egal, ob Anwendungsentwickler, Datenbankentwickler oder DB-Administrator -, wertvolle Hinweise für die Praxis.

Der Diplom-Informatiker (FH) Robert Panther ist als Senior Consultant für CGI in Deutschland tätig. Daneben schreibt er regelmäßig Fachartikel und Bücher zu seinen Spezialgebieten SQL Server und Anwendungsentwicklung für mobile Devices. Im Mai 2012 veröffentlichte er bei Microsoft Press in der Reihe 'Richtig einsteigen' eines der ersten deutschsprachigen Bücher zu SQL Server 2012. Anfang 2010 erschien bei entwickler.press sein SQL Server Performance-Ratgeber. Gelegentlich ist er auch als Speaker auf Konferenzen und in der Professional Association for SQL Server (PASS) aktiv. Mit Microsoft SQL Server beschäftigt er sich bereits seit der Version 6.0 sehr intensiv und hat hier bereits als Entwickler, Administrator und Datenbankarchitekt zahlreiche Projekte erfolgreich mitgestaltet.

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.

  1. Der so genannteParser prüft die Syntax der SQL-Anweisung und erstellt einen grobenAusführungsbaum.
  2. 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).
  3. 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:

  1. FROM bestimmt, welche Tabellen gelesen und wie sie miteinander verknüpft werden
  2. WHERE filtert die Tabellen zeilenweise aufgrund von Bedingungen
  3. GROUP BY fasst Zeilen des Zwischenergebnisses zusammen
  4. HAVING filtert die Zeilen des Zwischenergebnisses anhand von Bedingungen
  5. SELECT wählt die als Ergebnis zurückzugebenden Spalten aus
  6. ORDER BY sortiert die Ergebniszeilen
  7. 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