Laufende Abfragen in PostgreSQL anzeigen

Die Antwort ist die View pg_stat_activity. Hier ist die Abfrage zum Einfügen, dann was die Spalten tatsächlich bedeuten.

SELECT pid,
       usename,
       state,
       now() - query_start AS runtime,
       wait_event_type,
       left(query, 100) AS query
FROM pg_stat_activity
WHERE state <> 'idle'
ORDER BY query_start;

Die Ausgabe lesen

Wer blockiert wen

Wenn etwas wait_event_type = 'Lock' zeigt, finden Sie den Blockierer:

SELECT waiting.pid  AS waiting_pid,  left(waiting.query, 60)  AS waiting_query,
       blocking.pid AS blocking_pid, left(blocking.query, 60) AS blocking_query,
       now() - blocking.xact_start  AS blocking_xact_age
FROM pg_stat_activity waiting
JOIN pg_stat_activity blocking
  ON blocking.pid = ANY (pg_blocking_pids(waiting.pid));

Die üblichen Verdächtigen, bereit zum Einfügen

-- Seit mehr als 5 Minuten laufende Abfragen:
SELECT pid, now() - query_start AS runtime, left(query, 100)
FROM pg_stat_activity
WHERE state = 'active' AND query_start < now() - interval '5 minutes'
ORDER BY query_start;

-- "idle in transaction"-Sitzungen (halten Locks und blockieren Vacuum):
SELECT pid, usename, now() - xact_start AS xact_age, left(query, 100)
FROM pg_stat_activity
WHERE state = 'idle in transaction'
ORDER BY xact_start;

Berechtigungen: Sie sehen Ihre eigenen Sessions stets vollständig; der query-Text anderer Benutzer erfordert Mitgliedschaft in pg_read_all_stats (oder Superuser). Wenn die query-Spalte <insufficient privilege> anzeigt, ist das der Grund.

🔍 Die langsame Abfrage gefunden? Führen Sie sie mit EXPLAIN (ANALYZE, BUFFERS) aus und fügen Sie die Ausgabe in den EXPLAIN Visualizer ein. Möchten Sie sie stattdessen stoppen? Siehe wie man eine Abfrage sicher beendet.