CodeGym /Kurse /SQL SELF /Vergleichende Analyse von EXPLAIN ANALYZE u...

Vergleichende Analyse von EXPLAIN ANALYZE und pg_stat_statements

SQL SELF
Level 42 , Lektion 4
Verfügbar

An dieser Stelle hast du vielleicht eine ganz logische Frage: Warum brauchen wir eigentlich zwei verschiedene Tools für die Analyse? Was wird öfter benutzt: EXPLAIN ANALYZE oder pg_stat_statements? Lass uns diese beiden Ansätze, ihre Stärken und Schwächen sowie die Einsatzgebiete genauer anschauen.

Welche Aufgaben lösen die Tools?

EXPLAIN ANALYZE: Das ist das Tool für die Tiefenanalyse eines einzelnen, konkreten Queries. Wenn du wissen willst, wie PostgreSQL einen Query ausführt, welche Nodes benutzt werden, wie viele Zeilen verarbeitet werden und wie lange jede Operation dauert, dann ist das dein Ding. Es hilft dir bei der Frage: "Warum läuft mein konkreter Query so langsam?"

pg_stat_statements: Das ist das Monitoring-Tool auf einer höheren Ebene, das dir Infos über die Performance aller Queries in deiner Datenbank gibt. Das ist dein Tool, wenn du das große Ganze sehen willst: "Welche Queries sind in meiner Datenbank am langsamsten?" oder "Welche Queries verursachen die meiste Last auf dem Server?"

Wann solltest du EXPLAIN ANALYZE benutzen?

EXPLAIN ANALYZE ist dein Debugging-Tool, mit dem du verstehst, wie PostgreSQL einen bestimmten Query ausführt. Benutze es in folgenden Situationen:

Gezielte Query-Optimierung Wenn du eine Beschwerde bekommst, dass eine Seite deiner App ewig lädt, findest du zuerst den Query, der dafür verantwortlich ist, und wendest EXPLAIN ANALYZE an. Das zeigt dir den Ausführungsplan und echte Metriken wie Laufzeit und Anzahl der verarbeiteten Zeilen.

Den richtigen Index wählen Wenn du einen neuen Index anlegst oder einen bestehenden änderst, benutze EXPLAIN ANALYZE, um zu sehen, ob PostgreSQL diesen Index auch wirklich verwendet. Wenn nicht, hast du vielleicht einen Index gebaut, der für deine Queries nichts bringt.

Debugging von komplexen Queries Wenn du einen komplexen Query mit vielen JOIN oder WHERE schreibst, hilft dir die Analyse des echten Ausführungsplans mit EXPLAIN ANALYZE, Engpässe zu finden, zum Beispiel unnötige sequentielle Scans (hallo, Seq Scan).

Beispiel: Query-Optimierung mit EXPLAIN ANALYZE

-- Query, der langsam läuft
SELECT *
FROM students
WHERE name = 'Alice';

-- Wir analysieren den Ausführungsplan
EXPLAIN ANALYZE
SELECT *
FROM students
WHERE name = 'Alice';

Wenn du siehst, dass ein Seq Scan verwendet wird, hast du vielleicht vergessen, einen Index anzulegen:

-- Wir legen einen Index auf der Spalte name an
CREATE INDEX idx_students_name ON students(name);

-- Wir checken nochmal
EXPLAIN ANALYZE
SELECT *
FROM students
WHERE name = 'Alice';

Wann solltest du pg_stat_statements benutzen?

Dieses Tool ist unverzichtbar, wenn du die Performance des ganzen Systems analysieren willst. Benutze es in diesen Situationen:

Monitoring in Production pg_stat_statements zeigt dir die Ausführungsstatistiken der Queries über einen bestimmten Zeitraum. Du findest die langsamsten Queries easy über die Spalte total_time, die die gesamte Ausführungszeit jedes Queries anzeigt.

Finden von "schweren" Queries Willst du wissen, welche Queries am häufigsten Last auf deine Datenbank bringen? Sortiere die Queries nach Anzahl der Memory-Reads (shared_blks_hit) oder nach der Anzahl der verarbeiteten Zeilen (rows).

Erkennen von Queries mit hoher Ausführungsfrequenz Manchmal ist nicht nur ein langsamer Query ein Problem, sondern auch Queries, die sehr oft laufen. Wenn zum Beispiel ein Query 100 Mal pro Minute ausgeführt wird, kann schon eine kleine Optimierung die Serverlast deutlich senken.

Beispiel: Langsame Queries mit pg_stat_statements finden

-- Wir schauen uns die Query-Statistiken an
SELECT query,
       calls,
       total_time,
       rows
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 5;

Dieser Query zeigt dir die Top-5 Queries, die am meisten Zeit verbrauchen.

Vergleich der Ansätze: Wo liegt der Unterschied?

Kriterium EXPLAIN ANALYZE pg_stat_statements
Analyse-Fokus Ein einzelner, konkreter Query Globales Monitoring aller Queries
Detailgrad Echte Daten zu jedem Node im Plan Zusammengefasste Statistik pro Query
Kontext Wird in der Entwicklung benutzt Wird in Production eingesetzt
Ausführungsanforderung Führt den Query aus und misst die Zeit Führt keine Queries aus, aggregiert nur Daten
Setup-Aufwand Braucht kein Setup Erfordert Installation des Extensions
Ressourcenverbrauch Momentaufnahme Dauerhafte Statistik-Sammlung, abhängig von der Last

Beide Tools zusammen nutzen

Wie immer beim Programmieren gibt es keinen magischen Knopf, der alles löst. Der beste Ansatz ist, beide Tools zusammen zu verwenden. Zum Beispiel:

  1. Benutze pg_stat_statements, um die langsamsten oder häufigsten Queries in deinem System zu finden.

  2. Analysiere diese Queries dann mit EXPLAIN ANALYZE, um die Ursache für ihre schlechte Performance zu verstehen.

Praxistipp: Der kombinierte Ansatz

-- Schritt 1: Den langsamsten Query finden
SELECT query, total_time, calls
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 1;

-- Schritt 2: Diesen Query analysieren
EXPLAIN ANALYZE
<kopiere den Query aus dem vorherigen Schritt>;

Typische Fehler bei der Nutzung

Bei der Arbeit mit EXPLAIN ANALYZE und pg_stat_statements gibt es ein paar Fehler, die Anfänger oft machen:

  1. Vergessen, wie aktuell die Daten sind. Wenn du einen Query auf einer leeren Tabelle analysierst, kann das EXPLAIN ANALYZE-Ergebnis irreführend sein. Stell sicher, dass deine Testdatenbank die echten Datenmengen widerspiegelt.

  2. Monitoring-Overhead ignorieren. Wenn das pg_stat_statements-Extension auf dem Production-Server läuft, stell sicher, dass es optimal konfiguriert ist und keine unnötige Last erzeugt.

  3. Den theoretischen Plan statt des echten lesen. Denk dran: Ein einfaches EXPLAIN gibt dir nur den theoretischen Plan. Benutze EXPLAIN ANALYZE, um echte Daten zu bekommen.

Jetzt bist du mit allem ausgestattet, was du brauchst, um nicht nur langsame Queries zu bekämpfen, sondern sie auch zu verhindern. PostgreSQL gibt dir mächtige Tools an die Hand, und wenn du sie clever kombinierst, holst du auch aus stark belasteten Systemen das Maximum raus.

2
Aufgabe
SQL SELF, Level 42, Lektion 4
Gesperrt
Suche nach den "schwersten" Abfragen über `pg_stat_statements`
Suche nach den "schwersten" Abfragen über `pg_stat_statements`
1
Umfrage/Quiz
Query-Optimierung, Level 42, Lektion 4
Nicht verfügbar
Query-Optimierung
Query-Optimierung
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION