von Markus Winand.

PostgreSQL Ausführungspläne erstellen


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.

Hinweis in eigener Sache

Wenn Dir dieser Artikel gefällt, könnte mein Buch SQL Performance Explained oder mein Training auch etwas für Dich sein.

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

Foto von Markus Winand

Markus Winand lehrt effizientes SQL – inhouse und online. Er minimiert die Entwicklungszeit durch modernes SQL und optimiert die Laufzeit durch schlaue Indizierung – dazu hat er auch das Buch SQL Performance Explained veröffentlicht.

Sein Buch bei Amazon kaufen

Titelbild von „SQL Performance Explained“: Eichhörnchen läuft durchs Grass

Die Essenz: SQL-Tuning auf 200 Seiten

Bei Amazon kaufen
(Taschenbuch)

Taschenbuch und PDF auch auf Markus' Webseite erhältlich.

Holen Sie sich Markus

…für ein Training ins Büro.

Sein beliebtes Training stimmt Entwickler auf SQL Performance ein.

Erfahren Sie mehr»

„Use The Index, Luke!“ von Markus Winand ist unter einer Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License lizenziert.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz | CC-BY-NC-ND 3.0 Lizenz