| PostgreSQL: Das Offizielle Handbuch | ||||
|---|---|---|---|---|
| Zurück | Schnell zurück | Schnell nach vorne | Nach vorne | |
Dieser Befehl zeigt den Ausführungsplan, den der PostgreSQL-Planer für den angegebenen Befehl erzeugt. Der Ausführungsplan zeigt, wie die in dem Befehl verwendeten Tabellen durchsucht werden (sequentielle Suche, Indexsuche usw.) und wenn mehrere Tabellen verwendet werden, dann die Verbundalgorithmen, die verwendet werden um die entsprechenden Zeilen aus jeder Eingabetabelle zusammenzubringen.
Der wichtigste Teil der Ausgabe sind die geschätzten Ausführungskosten des Befehls; das ist die Schätzung des Planers, wie lange die Ausführung der Anfrage dauern wird (gemessen in Diskseiten-Fetchs). Gezeigt werden zwei Zahlen: die Startzeit, die benötigt wird, ehe die erste Zeile zurückgegeben werden kann, und die Gesamtzeit, die benötigt wird um alle Zeilen zurückzugeben. Bei den meisten Befehlen ist die Gesamtzeit entscheidend, aber zum Beispiel bei einer Unteranfrage in einer EXISTS-Klausel wählt der Planer die geringste Startzeit statt der geringsten Gesamtzeit (da der Executor sowieso nur eine Zeile lesen wird und dann aufhört). Wenn Sie die Klausel LIMIT verwenden um die Anzahl der zurückgegebenen Zeilen zu beschränken, dann interpoliert der Planer zwischen beiden Kostenangaben um herauszufinden, welcher Plan wirklich der bessere ist.
Mit der Option ANALYZE wird der Befehl auch tatsächlich ausgeführt, nicht nur geplant. Dann wird zusätzlich die in jedem Planknoten verbrachte Gesamtzeit (in Millisekunden) und die Anzahl der tatsächlich zurückgegebenen Zeilen ausgegeben. Das ist nützlich um festzustellen, ob die Schätzungen des Planers nahe an der Wirklichkeit sind.
Wichtig: Bedenken Sie, dass der Befehl wirklich ausgeführt wird, wenn ANALYZE verwendet wird. Das Ergebnis eines SELECT wird von EXPLAIN verworfen, aber andere Nebenwirkung finden normal statt. Wenn Sie EXPLAIN ANALYZE mit einem INSERT-, UPDATE- oder DELETE-Befehl verwenden möchten ohne die Daten zu verändern, machen Sie Folgendes:
BEGIN; EXPLAIN ANALYZE ...; ROLLBACK;
Führt den Befehl aus und zeigt die tatsächliche Laufzeit an.
Zeigt die volle interne Darstellung des Planbaums anstatt nur einer Zusammenfassung. Diese Option ist nur für das Debuggen von PostgreSQL nützlich. Das Ausgabeformat der VERBOSE-Ausgabe wird vom Konfigurationsparameter explain_pretty_print kontrolliert; wenn er an ist, dann wird die Ausgabe zur besseren Lesbarkeit eingerückt.
Ein SELECT-, INSERT-, UPDATE-, DELETE-, EXECUTE- oder DECLARE-Befehl, dessen Ausführungsplan Sie sehen möchten.
EXPLAIN gibt den vom PostgreSQL-Planer ermittelten Ausführungsplan des angegebenen Befehls aus.
Weitere Informationen über EXPLAIN und die Bedeutung der Kostenschätzung erhalten Sie in Abschnitt 13.1.
Vor PostgreSQL 7.3 wurde der Ausführungsplan in der Form einer NOTICE-Mitteilung ausgegeben. Jetzt erscheint er als Anfrageergebnis (wie eine Tabelle mit einer einer Spalte vom Typ text.)
Ein Ausführungsplan für eine einfache Anfrage mit einer Tabelle mit einer Spalte vom Typ integer und 10000 Zeilen:
EXPLAIN SELECT * FROM foo;
QUERY PLAN
---------------------------------------------------------
Seq Scan on foo (cost=0.00..155.00 rows=10000 width=4)
(1 row)
Wenn es einen Index gibt und die Anfrage eine indizierbare WHERE-Bedingung hat, dann könnte EXPLAIN einen anderen Plan anzeigen:
EXPLAIN SELECT * FROM foo WHERE i = 4;
QUERY PLAN
--------------------------------------------------------------
Index Scan using fi on foo (cost=0.00..5.98 rows=1 width=4)
Index Cond: (i = 4)
(2 rows)
Hier ein Beispiel für einen Ausführungsplan einer Anfrage mit Aggregatfunktion:
EXPLAIN SELECT sum(i) FROM foo WHERE i < 10;
QUERY PLAN
---------------------------------------------------------------------
Aggregate (cost=23.93..23.93 rows=1 width=4)
-> Index Scan using fi on foo (cost=0.00..23.92 rows=6 width=4)
Index Cond: (i < 10)
(3 rows)
Natürlich hängen die gezeigten Zahlen von tatsächlichen Inhalt der Tabelle ab. Beachten Sie außerdem, dass die Zahlen, und sogar die ausgewählten Anfragestrategien, je nach PostgreSQL-Version wegen Planerverbesserungen unterschiedlich ausfallen können.
| Zurück | Zum Anfang | Nach vorne |
| EXECUTE | Nach oben | FETCH |