EXPLAIN ANALYZE ist das wichtigste Optimierungswerkzeug.
Verwendung¶
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id=123;
EXPLAIN (ANALYZE, BUFFERS) SELECT ...;
Scans¶
- Seq Scan — gesamte Tabelle
- Index Scan — Index + Fetch
- Index Only Scan — nur Index
- Bitmap — für mehrere Zeilen
Joins¶
- Nested Loop — kleine Tabellen
- Hash Join — große ohne Index
- Merge Join — sortierte Daten
Optimierung¶
- Fehlenden Index hinzufügen
- ANALYZE für Statistiken
- Subquery → JOIN
- work_mem für Sortierungen erhöhen
EXPLAIN-Ausgabe lesen¶
Achten Sie bei der Analyse der EXPLAIN-ANALYZE-Ausgabe auf den Unterschied zwischen geschaetzten Kosten und tatsaechlicher Zeit. Eine grosse Abweichung signalisiert veraltete Statistiken — fuehren Sie ANALYZE auf der betreffenden Tabelle aus. Ein Seq Scan auf einer grossen Tabelle mit WHERE-Bedingung bedeutet normalerweise einen fehlenden Index.
Ueberwachen Sie Buffers: shared hit vs. shared read — ein hoher Read-Anteil bedeutet, dass Daten nicht im Cache sind und von der Festplatte gelesen werden. Eine Erhoehung von shared_buffers kann helfen. Bei Sort-Operationen pruefen Sie, ob sie im Speicher oder auf der Festplatte ausgefuehrt werden (Sort Method: external merge). Erhoehen Sie in diesem Fall work_mem. Die auto_explain-Erweiterung mit dem Parameter log_min_duration protokolliert automatisch langsame Abfragen mit ihren Plaenen, was fuer die Produktionsoptimierung unerlaesslich ist.
EXPLAIN = Abfrage-Debugging¶
Cost vs. Actual deckt Probleme auf.