26.02.2014 Aufrufe

ADMIN Magazin Gestapelt - Schneller und sicherer mit RAID (Vorschau)

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!