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

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.