Plan im Detail lesen mit EXPLAIN (ANALYZE, BUFFERS, SETTINGS, WAL)
PostgreSQLPerformanceBefehl
-- ANALYZE really executes the statement: run DML inside a transaction and roll it back
BEGIN;
EXPLAIN (ANALYZE, BUFFERS, SETTINGS, WAL, VERBOSE)
UPDATE customer SET balance = balance + 1 WHERE city = 'Ankara';
ROLLBACK;
-- For SELECT
EXPLAIN (ANALYZE, BUFFERS, SETTINGS)
SELECT name FROM customer ORDER BY name DESC LIMIT 10 OFFSET 1000;Was es tut
Liefert den Plan mit echten Ausführungsstatistiken: BUFFERS zeigt je Knoten Shared hit/read/dirtied und Temp-Blöcke, SETTINGS zeigt planungsrelevante Parameter mit Nicht-Standardwerten, WAL zeigt die erzeugten WAL-Records/-Bytes.
Wann einsetzen
Um die Abweichung zwischen geschätzten und tatsächlichen Zeilen, auf die Platte ausgelagerte Sortierungen/Hashes (Sort Method: external merge, temp read/written) und die WAL-Kosten von DML zu analysieren.
Vorsicht
ANALYZE führt die Anweisung wirklich aus; DML immer innerhalb von BEGIN/ROLLBACK ausführen (Trigger und Sequence-Inkremente finden trotzdem statt). Lesetipps: Eine Abweichung um Faktor 10 oder mehr zwischen geschätzten 'rows' und 'actual rows' deutet auf ein Statistikproblem hin; bei Knoten in Schleifen gelten Zeit und Zeilen je Schleife, für den Gesamtwert mit loops multiplizieren; hohe 'Heap Fetches' bei einem Index Only Scan bedeuten eine veraltete Visibility Map, und 'Workers Planned' > 'Workers Launched' bedeutet einen erschöpften Worker-Pool. Bei hohem Timing-Overhead TIMING OFF verwenden; COSTS OFF blendet auch den JIT-Abschnitt aus.
Verwandte Einträge
- Teuerste Abfragen finden (pg_stat_statements: Gesamt- und mittlere Zeit)
- Abfragen finden, die Platten-I/O, Temp-Dateien und WAL verursachen (pg_stat_statements)
- Statistiken von pg_stat_statements zurücksetzen (alle oder eine einzelne Abfrage)
- Ausführungspläne langsamer Abfragen mit auto_explain protokollieren
- Planregressionen per queryid erkennen (Snapshot-Vergleich von pg_stat_statements)
- Kapazität für Parallel Query und aktuelle Worker-Nutzung prüfen