Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Basics<br />
Ausführungspläne<br />
Bei einem Indexzugriff können Filterprädikate<br />
auch ein Zeichen für eine falsche<br />
Spaltenreihenfolge sein (Beispiel 2).<br />
Nur wenn als Zugriffsprädikat die Werte<br />
»access« oder »seek predicate« angezeigt<br />
werden, nutzt die Abfrage den Index optimal<br />
aus.<br />
Beispiel 3: Ausführungsplan einer PostgreSQL-Datenbank<br />
01 postgres=# EXPLAIN 1<br />
02 postgres‐# SELECT *<br />
03 postgres‐# FROM sales s<br />
04 postgres‐# JOIN employees e ON (s.employee_id = e.employee_id)<br />
Filter- <strong>und</strong> Zugriffsprädikate können<br />
sinngemäß auch bei der Suche in einem<br />
gedruckten Telefonbuch vorkommen,<br />
wenn man zum Beispiel nur den Nachnamen<br />
<strong>und</strong> die Anschrift der gesuchten<br />
Person kennt. Dabei ist der erste Schritt,<br />
etwa alle Einträge für „Müller“ zu finden,<br />
05 postgres‐# WHERE s.sale_date > CURRENT_DATE ‐ INTERVAL '6' MONTH<br />
06 postgres‐# AND s.eur_value >= 10;<br />
07 <br />
Beispiel 2: SQL Server-Ausführungsplan erklärt<br />
Hier kann man sich über die Schaltfläche »Display<br />
Estimated Execution Plan« den Ausführungsplan<br />
anzeigen lassen. Bewegt man den<br />
Mauszeiger über eine Operation, öffnet sich<br />
ein Tool-Tip <strong>mit</strong> zusätzlichen Informationen. Der<br />
Cost-Wert der einzelnen Operation wird gleich<br />
dreimal angezeigt: zuerst aufgeteilt nach I/<br />
O- <strong>und</strong> CPU-Cost, dann die Gesamtkosten. Zuletzt<br />
wird auch der Cost-Wert des gesamten<br />
08 QUERY PLAN<br />
09 ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐<br />
10 Hash Join ( 2 cost=3091.01..13119.07 rows=59654 width=1286)<br />
11 Hash Cond: (s.employee_id = e.employee_id)<br />
12 ‐> Index Scan using sale_date on sales s (cost=0.01..3893.82 rows=59654 width=251)<br />
13 Index Cond: (sale_date > (('now'::text)::date ‐ '6 mons'::interval month))<br />
14 3 Filter: (eur_value >= 10::numeric)<br />
15 ‐> Hash (cost=1672.00..1672.00 4 rows=10000 width=1035)<br />
Teil-Baumes angezeigt. Die Gesamtkosten findet<br />
man im Tool-Tip auf oberster Ebene. Das<br />
Filterprädikat (»Predicate«) ist ein Hinweis,<br />
dass die Spalte »EUR_VALUE« nicht an einer<br />
geeigneten Index-Position für eine effiziente<br />
Nutzung steht. Das Zugriffsprädikat (»YSeek<br />
Predicate«) beim Indexzugriff zeigt, dass der<br />
Index nur für die Bedingung auf »SALE_DATE«<br />
effizient genutzt wird.<br />
16 ‐> Seq Scan on employees e (cost=0.00..1672.00 rows=10000 width=1035)<br />
1 Durch das Voranstellen von explain vor die SQL-Abfrage wird der Ausführungsplan angezeigt.<br />
2 Die Cost-Werte werden für jeden Teil-Baum des Ausführungsplanes angezeigt. PostgreSQL zeigt<br />
dabei jeweils zwei Werte an: zuerst die Setupkosten, dann die Gesamtkosten.<br />
3 Das Filterprädikat beim Indexzugriff ist bei PostgreSQL ein Hinweis, dass die Spalte EUR_VALUE<br />
nicht im Index SALE_DATE vorhanden ist.<br />
4 Durch die rows- <strong>und</strong> width-Werte beim Hash-Zweig der Join-Operation kann man auf den Speicherbedarf<br />
schließen. Dadurch wird auch deutlich, dass der Speicherbedarf nicht nur von den Zeilen,<br />
sondern auch von den selektierten Spalten – der Zeilenlänge – abhängig ist. Selektiert man<br />
weniger Spalten, reduziert sich der Speicherbedarf.<br />
sehr rasch erledigt. Aufgr<strong>und</strong> der Sortierung<br />
des Telefonbuches kann man sich<br />
durch Vor- <strong>und</strong> Zurückblättern schnell<br />
an „Müller“ annähern. Genau genommen<br />
führt man dabei eine binäre Suche durch,<br />
deren Aufwand nur logarithmisch <strong>mit</strong> der<br />
Größe des Telefonbuches wächst. Anders<br />
gesagt, wenn das Telefonbuch zehnmal<br />
so groß ist, dauert die Suche deswegen<br />
nicht auch gleich zehnmal so lange.<br />
In einer Datenbank wäre die Bedingung<br />
NACHNAME=’MÜLLER’ daher ein Zugriffsprädikat.<br />
Hat man die „Müllers“<br />
gef<strong>und</strong>en, bleibt noch die Eingrenzung<br />
<strong>mit</strong> der bekannten Adresse. Ohne den<br />
Vornamen zu kennen, kann man aber<br />
die Sortierung des Telefonbuches nicht<br />
weiter nutzen. Es bleibt einem also nichts<br />
anderes übrig, als alle „Müllers“ durchzugehen.<br />
In einer Datenbank wäre diese<br />
Bedingung daher ein Filterprädikat. Die<br />
Suchdauer steigt linear <strong>mit</strong> der Anzahl<br />
der „Müllers.“<br />
Filtern dauert viel länger<br />
Der Unterschied zwischen Zugriffs- <strong>und</strong><br />
Filterprädikaten wird häufig unterschätzt,<br />
kann aber durchaus beachtlich sein. Abbildung<br />
2 stellt den Performance-Unterschied<br />
dar. Im Idealfall – wenn zum<br />
Beispiel nur Zugriffsprädikate verwendet<br />
werden – kann die Geschwindigkeit auch<br />
bei einer stark wachsenden Tabelle nahezu<br />
konstant bleiben (grün dargestellt).<br />
Je mehr Filterprädikate verwendet werden,<br />
desto größer wird der Einfluss der<br />
Tabellengröße auf die Geschwindigkeit<br />
(rot dargestellt). Anders ausgedrückt<br />
kann man durch die Filter- <strong>und</strong> Zugriffsprädikate<br />
eine Prognose über die Geschwindigkeit<br />
bei wachsendem Datenvolumen<br />
anstellen <strong>und</strong> dadurch Probleme<br />
im Vorhinein erkennen. Die Ursache des<br />
eklatanten Performance-Unterschiedes<br />
in der Abbildung ist übrigens, dass die<br />
zweite <strong>und</strong> dritte Spalte im Index vertauscht<br />
wurden.<br />
Bei der Indizierung einer Datenbank<br />
muss man aber unbedingt ganzheitlich<br />
vorgehen. Insbesondere das Ändern der<br />
Spaltenreihenfolge ist gefährlich, weil<br />
es den Index für andere Abfragen unbrauchbar<br />
machen kann. Indexänderungen<br />
muss man daher ausgiebig testen,<br />
sorgfältig planen <strong>und</strong> natürlich <strong>mit</strong> dem<br />
Applikationshersteller abklären.<br />
90 Ausgabe 06-2012 Admin www.admin-magazin.de