Come vedere le query in esecuzione in PostgreSQL
La risposta è la vista pg_stat_activity. Ecco la query da incollare, poi cosa significano davvero le colonne.
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;
Leggere l'output
state—activesignifica in esecuzione proprio ora.idleè una sessione connessa che non fa nulla (ecco perché la filtriamo).idle in transactionmerita attenzione: tiene lock e blocca il vacuum pur non facendo nulla.query— la query corrente per le sessioni active, ma l'ultima query per quelle idle. Una query accanto astate = 'idle'è già finita; non inseguirla.wait_event_type— non-null significa che la query sta aspettando, non calcolando.Locksignifica che è bloccata da un'altra transazione;IOsignifica che sta leggendo/scrivendo.- Il testo di query lunghe è troncato a
track_activity_query_sizebyte (default 1024) — alzalo se il tuo ORM genera romanzi.
Chi blocca chi
Quando qualcosa mostra wait_event_type = 'Lock', trova il bloccante:
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));
I soliti sospetti, pronti da incollare
-- Query attive da più di 5 minuti:
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;
-- Sessioni "idle in transaction" (tengono lock e bloccano 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;
Permessi: vedi sempre per intero le tue sessioni; il testo della query di altri utenti richiede l'appartenenza a pg_read_all_stats (o essere superuser). Se la colonna query dice <insufficient privilege>, il motivo è questo.
🔍
Trovata la query lenta? Eseguila con
EXPLAIN (ANALYZE, BUFFERS) e incolla l'output nel Visualizzatore EXPLAIN. Devi invece fermarla? Vedi come terminare una query in sicurezza.
