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
state—activebedeutet, läuft gerade jetzt.idleist eine verbundene Session, die nichts tut (deshalb filtern wir sie heraus).idle in transactionverdient Aufmerksamkeit: sie hält Sperren und blockiert Vacuum, während sie nichts tut.query— die aktuelle Abfrage bei aktiven Sessions, aber die letzte Abfrage bei untätigen. Eine Abfrage nebenstate = 'idle'ist bereits beendet; jagen Sie ihr nicht nach.wait_event_type— nicht-null bedeutet, die Abfrage wartet, rechnet nicht.Lockbedeutet, sie ist von einer anderen Transaktion blockiert;IObedeutet, sie liest/schreibt.- Langer Abfragetext wird auf
track_activity_query_sizeBytes gekürzt (Standard 1024) — erhöhen Sie es, wenn Ihr ORM Romane erzeugt.
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.
