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 $1PostgreSQL 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 1In 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.
BEGINEXPLAIN (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 msROLLBACKDer 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
