PostgreSQL Ausführungspläne erstellen


Diese Seite für

Einen Ausführungsplan erstellt man, indem man der entsprechenden SQL-Anweisung explain voranstellt. Um einen Ausführungsplan für para­metri­sierte SQL-Anweisungen zu erstellen (z. B. mit $1, $2, …), muss man die Anweisung zuerst vorbereiten:

PREPARE stmt(int) AS SELECT $1

PostgreSQL verwendet das Dollarzeichen für Platzhalter. Viele Daten­bank­treiber bzw. Abstraktionsschichten bieten auch die Möglichkeit, das Fragezeichen des SQL-Standards zu benutzen.

Sobald die Anweisung vorbereitet wurde, kann man den Ausführungsplan erstellen:

EXPLAIN EXECUTE stmt(1)

Bis PostgreSQL 9.1 wurde der Ausführungsplan bereits mit dem prepare erstellt. Die Werte, die beim execute angegeben werden, wurden nicht berücksichtigt. Seit PostgreSQL 9.2 wird der Ausführungsplan erst mit dem execute erstellt und kann daher an die gegebenen Werte angepasst werden.

Beachte

Für Anweisungen ohne Parametrisierung kann man den Aus­füh­rungs­plan direkt erstellen:

EXPLAIN SELECT 1

In diesem Fall hat der Optimizer die konkreten Werte beim Erstellen des Ausführungsplanes schon immer berücksichtigt. Wenn man PostgreSQL 9.1 oder älter verwendet, und in einem Programm parametrisierte Abfragen benutzt, sollte man beim Erstellen eines Ausführungsplanes ebenfalls parametrisierte Abfragen benutzen, damit man denselben Ausführungsplan erhält.

Der Ausführungsplan sieht wie folgt aus:

                QUERY PLAN                
------------------------------------------
 Result  (cost=0.00..0.01 rows=1 width=0)

Ein PostgreSQL-Ausführungsplan hat ähnliche Elemente wie die Ausfüh­rungspläne der Oracle Datenbank, die im Buch gezeigt werden: die Operation („Result“); den Cost-Wert; die geschätzte Zeilenzahl und die Zeilenbreite.

Ein wesentlicher Unterschied ist, dass PostgreSQL zwei Cost-Werte anzeigt. Der Erste spiegelt die Startkosten wieder, der Zweite die Gesamt­kos­ten, wenn alle Zeilen geladen werden. Der Cost-Wert eines Oracle-Ausführungsplanes entspricht dem zweiten Cost-Wert des PostgreSQL-Ausführungsplanes.

Das PostgreSQL-Kommando explain kennt zwei Optionen: Die Option VERBOSE zeigt zusätzliche Informationen wie die voll qualifizierten Tabellen­namen an. Diese Option ist nicht sonderlich nützlich.

Bei unseren Schlulungs-, Tuning-, und
Literaturangeboten ist für jeden was dabei

Die zweite Option ist ANALYZE. Obwohl explain analyze sehr weit verbreitet ist, empfehle ich es nicht automatisch zu benutzen, da es die SQL-Anweisung tatsächlich ausführt. Das ist zwar kein Problem bei select-Abfragen, kann aber ungewollt Daten modifizieren, wenn man es versehentlich mit insert, update oder delete verwendet. Man kann explain analyze natürlich in eine Transaktion kapseln und anschließend ein rollback durchführen.

Warnung

explain analyze führt die SQL-Anweisung aus. Selbst wenn es ein insert, update oder delete ist.

Die Option ANALYZE führt die SQL-Anweisung aus und zeichnet dabei die Ausführungszeiten sowie die Anzahl der Zeilen auf.

BEGIN;
EXPLAIN ANALYZE EXECUTE stmt(1);
                   QUERY PLAN
--------------------------------------------------
 Result  (cost=0.00..0.01 rows=1 width=0)
         (actual time=0.002..0.002 rows=1 loops=1)
 Total runtime: 0.020 ms;
ROLLBACK;

Der Ausführungsplan wurde zur besseren Lesbarkeit formatiert – die „actual“-Werte werden normalerweise in derselben Zeile angegeben wie die geschätzten Werte.

Die Zeilenzahl „rows“ ist der einzige Wert, der in beiden Teilen – der Schätzung und den gemessenen Werten – angezeigt wird. Dadurch kann man Fehlschätzungen des Optimizers schnell erkennen.

Anweisungen, die mit prepare vorbereitet wurden, müssen auch wieder geschlossen werden:

DEALLOCATE stmt

Über den Autor

Photo of Markus Winand
Markus Winand stimmt Entwickler auf SQL-Performance ein. Er hat das Buch SQL Performance Explained veröffentlicht und bietet inhouse Schulungen sowie Tuning-Leistungen auf http://winand.at/ an.