Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Ausführungspläne<br />
Basics<br />
Weniger bekannt, aber nicht weniger<br />
nützlich ist, dass man aus Ausführungsplänen<br />
auch etwas über den Speicherbedarf<br />
einer SQL-Abfrage erfahren kann<br />
– also darüber, wie viel Hauptspeicher<br />
während der Ausführung benötigt wird.<br />
Speicherbedarf<br />
Dafür kann man die Operationen, die im<br />
Ausführungsplan angezeigt werden, in<br />
zwei Kategorien unterteilen:<br />
n jene, die generell nur einen geringen<br />
Speicherbedarf haben <strong>und</strong><br />
n jene, die ein Zwischenergebnis im Arbeitsspeicher<br />
ablegen müssen <strong>und</strong> da<strong>mit</strong><br />
einen potenziell großen Speicherbedarf<br />
haben.<br />
Bei der Ressourcenplanung braucht man<br />
sich freilich nur um die zweite Kategorie<br />
kümmern. Das sind vor allem Sortier- <strong>und</strong><br />
Gruppieroperationen aber auch sämtliche<br />
Operationen, die einen Hash-Algorithmus<br />
verwenden – etwa der Hash-Join. Obwohl<br />
die Namen dieser Operationen in<br />
den verschiedenen Datenbank-Produkten<br />
abweichen, verraten sich die Speicherintensiven<br />
meist durch „Sort“, „Group“<br />
oder „Hash“ im Namen. Dennoch gibt<br />
es auch Spezialfälle wie die Operation<br />
»SORT GROUP BY NOSORT« der Oracle<br />
Beispiel 4: MySQL-Ausführungsplan erklärt<br />
01 sqyl> EXPLAIN 1<br />
02 ‐> SELECT *<br />
03 ‐><br />
04 FROM sales s<br />
05 ‐><br />
06 JOIN employees e ON (s.employee_id = e.employee_id)<br />
07 ‐><br />
08 WHERE s.sale_date > CURRENT_DATE ‐ INTERVAL '6' MONTH<br />
09 ‐><br />
10 AND s.eur_value >= 10;<br />
Datenbank: Sie führt keine Sortierung,<br />
sondern ein Group-by auf vorsortierten<br />
Daten durch.<br />
Das Gute an Ausführungsplänen ist, dass<br />
sie auch implizite Sortierungen explizit<br />
anzeigen. Wenn man zum Beispiel zwei<br />
Tabellen versehentlich <strong>mit</strong>tels UNION<br />
verbindet, zeigt der Ausführungsplan<br />
auch die Operation zum Deduplizieren<br />
der Ergebnisse an (Ausnahme: MySQL).<br />
Wenn aber aufgr<strong>und</strong> der Daten ohnehin<br />
keine Duplikate vorkommen können, <strong>und</strong><br />
da<strong>mit</strong> ein UNION ALL genügt, verschwindet<br />
diese Operation <strong>und</strong> da<strong>mit</strong> auch der<br />
entsprechende Speicherbedarf.<br />
Ebenso wird bei einem DISTINCT eine<br />
entsprechende Gruppier- oder Hash-Operation<br />
angezeigt, die wiederum <strong>mit</strong> einem<br />
gewissen Speicherbedarf einhergeht.<br />
11 +‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+<br />
12 | id | table | type | key | key_len | rows | Extra |<br />
13 +‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+<br />
14 | 1 | s | range | sale_date | 3 | 81858 | Using index condition; |<br />
2<br />
15 <br />
Using where ‚ |<br />
16 | 1 | e | ALL | NULL | NULL | 10031 | Using where; |<br />
17 Using join buffer 3 |<br />
(Block Nested Loop) |<br />
18 +‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+<br />
1 Durch das Voranstellen von explain vor die SQL-Abfrage wird der Ausführungsplan angezeigt.<br />
2 »Using Where« in der Spalte »Extra« zeigt an, dass sich nicht alle Bedingungen über den Index<br />
auflösen lassen. Aus dem Ausführungsplan alleine kann man aber nicht erkennen, welche Bedingungen<br />
das sind.<br />
3 MySQL verwendet einen Block-Nested-Loops-Join, der einen Speicherbedarf ähnlich einem Hash-<br />
Join hat.<br />
Antwortzeit [sec]<br />
1.2<br />
1.0<br />
0.8<br />
0.6<br />
0.4<br />
0.2<br />
0.0<br />
Filterprädikate<br />
Umgekehrt gibt es auch Fälle, in denen<br />
Datenbanken eine scheinbar notwendige<br />
Sortieroperation unterlassen. So kann es<br />
vorkommen, dass trotz Order-by-Klausel<br />
in der SQL-Abfrage keine Sortieroperation<br />
im Ausführungsplan erscheint. Dies<br />
ist meist auf eine gewiefte Indizierung<br />
zurückzuführen, die dafür sorgt, dass der<br />
Index die Daten bereits in der gewünschten<br />
Reihenfolge liefert. Diese Technik<br />
wird oft <strong>mit</strong> Li<strong>mit</strong>- oder Top-Klauseln<br />
kombiniert <strong>und</strong> führt im Idealfall dazu,<br />
dass der Ressourcenbedarf fast völlig von<br />
der Tabellengröße entkoppelt ist. So kann<br />
die Geschwindigkeit einer Abfrage, die<br />
keine Where-Klausel hat, sogar unabhängig<br />
von der Tabellengröße sein, wenn ein<br />
passender Index im Spiel ist. Der SQL-<br />
Abfrage selbst ist das nicht anzusehen.<br />
Im Ausführungsplan erkennt man diese<br />
Technik aber durch die fehlende Sortieroperation.<br />
Fazit<br />
Zugriffsprädikate<br />
0.0<br />
0 20 40 60 80 100<br />
Tabellengröße [x3000 Zeilen]<br />
Abbildung 2: Bei steigender Tabellengröße offenbart sich die ineffektive Indexnutzung.<br />
1.2<br />
1.0<br />
0.8<br />
0.6<br />
0.4<br />
0.2<br />
Antwortzeit [sec]<br />
Ausführungspläne gehören alleine wegen<br />
der Fakten, die sie uns über die Datenbank<br />
verraten, in das Repertoire aller<br />
Datenbank-Adminstratoren <strong>und</strong> SQL-<br />
Entwickler. Sie können helfen, die Ursache<br />
von Performance-Problemen klar zu<br />
erkennen <strong>und</strong> zu beheben. (jbr) n<br />
Infos<br />
[1] Ausführungspläne: [http:// use‐the‐index‐<br />
luke. com/ de/ sql/ ausfuehrungsplaene]<br />
Der Autor<br />
Markus Winand hat sich als Autor, Trainer <strong>und</strong><br />
Coach darauf spezialisiert, Entwicklern bei Problemen<br />
<strong>mit</strong> der SQL-Performance zu helfen. Er hat<br />
das Buch „SQL Performance Explained“ veröffentlicht<br />
<strong>und</strong> twittert seine besten Performance-<br />
Tipps als @SQLPerfTips.<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 06-2012<br />
91