Dafür kann man die Operationen, die im Ausführungsplan angezeigt werden, in zwei Kategorien unterteilen:
Bei der Ressourcenplanung braucht man sich freilich nur um die zweite Kategorie kümmern. Das sind vor allem Sortier- und Gruppieroperationen aber auch sämtliche Operationen, die einen Hash-Algorithmus verwenden – etwa der Hash-Join. Obwohl die Namen dieser Operationen in den verschiedenen Datenbank-Produkten abweichen, verraten sich die Speicherintensiven meist durch "Sort", "Group" oder "Hash" im Namen. Dennoch gibt es auch Spezialfälle wie die Operation
»SORT GROUP BY NOSORT
«
der Oracle Datenbank: Sie führt keine Sortierung, sondern ein Group-by auf vorsortierten Daten durch.
Das Gute an Ausführungsplänen ist, dass sie auch implizite Sortierungen explizit anzeigen. Wenn man zum Beispiel zwei Tabellen versehentlich mittels UNION verbindet, zeigt der Ausführungsplan auch die Operation zum Deduplizieren der Ergebnisse an (Ausnahme: MySQL). Wenn aber aufgrund der Daten ohnehin keine Duplikate vorkommen können, und damit ein UNION ALL genügt, verschwindet diese Operation und damit auch der entsprechende Speicherbedarf.
Beispiel 4: MySQL-Ausführungsplan erklärt
Durch das Voranstellen von explain vor die SQL-Abfrage wird der Ausführungsplan angezeigt.
»Using Where
«
in der Spalte
»Extra
«
zeigt an, dass sich nicht alle Bedingungen über den Index auflösen lassen. Aus dem Ausführungsplan alleine kann man aber nicht erkennen, welche Bedingungen das sind.
MySQL verwendet einen Block-Nested-Loops-Join, der einen Speicherbedarf ähnlich einem Hash-Join hat.
Ebenso wird bei einem DISTINCT eine entsprechende Gruppier- oder Hash-Operation angezeigt, die wiederum mit einem gewissen Speicherbedarf einhergeht. Umgekehrt gibt es auch Fälle, in denen Datenbanken eine scheinbar notwendige Sortieroperation unterlassen. So kann es vorkommen, dass trotz Order-by-Klausel in der SQL-Abfrage keine Sortieroperation im Ausführungsplan erscheint. Dies ist meist auf eine gewiefte Indizierung zurückzuführen, die dafür sorgt, dass der Index die Daten bereits in der gewünschten Reihenfolge liefert. Diese Technik wird oft mit Limit- oder Top-Klauseln kombiniert und führt im Idealfall dazu, dass der Ressourcenbedarf fast völlig von der Tabellengröße entkoppelt ist. So kann die Geschwindigkeit einer Abfrage, die keine Where-Klausel hat, sogar unabhängig von der Tabellengröße sein, wenn ein passender Index im Spiel ist. Der SQL-Abfrage selbst ist das nicht anzusehen. Im Ausführungsplan erkennt man diese Technik aber durch die fehlende Sortieroperation.
Ausführungspläne gehören alleine wegen der Fakten, die sie uns über die Datenbank verraten, in das Repertoire aller Datenbank-Adminstratoren und SQL-Entwickler. Sie können helfen, die Ursache von Performance-Problemen klar zu erkennen und zu beheben.
Infos