Einen Ausführungsplan erstellt man, indem man der entsprechenden SQL-Anweisung explain
voranstellt. Um einen Ausführungsplan für parametrisierte 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 Datenbanktreiber 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)
Seit PostgreSQL 9.2 wird der Ausführungsplan erst mit dem execute
erstellt und kann daher an die gegebenen Werte angepasst werden. Um einen von den Werten unabhängigen Ausführungsplan zu erstellen, wurde mit PostgreSQL 16 die Option Generic_Plan
von Explain
eingeführt.
Beachte
Für Anweisungen ohne Parametrisierung kann man den Ausführungsplan direkt erstellen:
EXPLAIN SELECT 1
In diesem Fall hat der Optimizer die konkreten Werte beim Erstellen des Ausführungsplanes schon immer berücksichtigt.
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ührungsplä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 wider, der Zweite die Gesamtkosten, 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 einige von denen analyze
, buffers
und settings
die wichtigsten sind.
Wenn du diese Seite magst, magst du vielleicht auch …
… meine Newsletter bestellen, gratis Sticker erhalten, mein Buch kaufen oder an einer Schulung teilnehmen.
Durch aktivierung der Option Analyze
wird der Ausführungsplan nicht nur erzeugt, sondern auch ausgeführt. Daraus folgt, dass alle Nebenwirkungen, die die Anweisung hat, tatsächlich eintreten. Wie zum Beispiel das Löschen von Zeilen, wenn man eine Delete
-Anweisung Explain
-ed. Auch Explain
kann Teil einer Transaktion sein, sodass man solche Nebeneffekte mit Rollback
zurücknehmen kann.
Warnung
explain analyze
führt die SQL-Anweisung aus. Selbst wenn es ein insert
, update
oder delete
ist.
Da die Anweisung mit der Option Analyze
ausgeführt wird, kann das System während der Ausführung Messwerte sammeln. Das ist insbesondere die Zeit und die tatsächlich verarbeitete Anzahl an Zeilen pro Operation. Wenn man zusätzlich die Option Buffers
aktiviert, erhält man auch die Anzahl der benötigten Blöcke.
Die Option Settings
gibt zusätzlich alle von den Voreinstellungen abweichenden Einstellungen aus.
BEGIN
EXPLAIN (ANALYZE, BUFFERS, SETTINGS)
EXECUTE stmt(1)
QUERY PLAN
--------------------------------------------------
Result (cost=0.00..0.01 rows=1 width=4)
(actual time=0.001..0.002 rows=1 loops=1)
Settings: random_page_cost = '1.1'
Planning Time: 0.032 ms
Execution Time: 0.078 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