Vista di sistema che restituisce una riga per ogni processo server attivo nell'istanza PostgreSQL. È lo strumento principale per osservare in tempo reale cosa sta facendo il database.
Cosa mostra
| Colonna | Descrizione |
|---|---|
pid |
PID del processo backend |
usename |
Utente PostgreSQL connesso |
datname |
Database a cui è connesso |
state |
Stato del processo (active, idle, idle in transaction, ecc…) |
query |
Testo dell'ultima query eseguita (o in esecuzione) |
query_start |
Timestamp di inizio eseguzione della query |
wait_event_type / wait_event |
Tipo e nome dell'evento di attesa (lock, I/O, ecc…) |
backend_type |
Tipo di processo (client backend, autovacuum worker, ecc…) |
application_name |
Nome dell'applicazione client |
client_addr |
Indirizzo IP del client |
Casi d'uso tipici
- Trovare query lente o bloccate
SELECT pid, now() - query_start AS durata, state, query
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY durata DESC;
- Individuare lock e attese — utile per capire perché una sessione è ferma: attesa di un lock, I/O lento, client non risponde, ecc.
SELECT pid, wait_event_type, wait_event, query
FROM pg_stat_activity
WHERE wait_event IS NOT NULL;
- Terminare una connessione bloccata
⚠️ Usa il codice con cautela
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid = <pid_da_terminare>;
pg_terminate_backend() è una funzione PostgreSQL che serve a chiudere forzatamente una specifica connessione o sessione attiva nel database
Note
Richiede il ruolo
pg_monitor(o superuser) per vedere le query degli altri utenti. Senza di esso, la colonnaqueryappareNULLper le sessioni altrui.-- mostra se l'utente corrente ha il ruolo `pg_monitor` assengato SELECT rolsuper AS is_superuser, pg_has_role(CURRENT_USER, 'pg_monitor', 'MEMBER') AS has_pg_monitor FROM pg_roles WHERE rolname = CURRENT_USER;