Comment voir les requêtes en cours dans PostgreSQL

La réponse est la vue pg_stat_activity. Voici la requête à coller, puis ce que les colonnes signifient réellement.

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;

Lire la sortie

Qui bloque qui

Lorsque quelque chose affiche wait_event_type = 'Lock', trouvez le bloqueur :

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));

Les suspects habituels, prêts à coller

-- Requêtes actives depuis plus de 5 minutes :
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;

-- Sessions "idle in transaction" (elles tiennent des verrous et bloquent le 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;

Permissions : vous voyez toujours vos propres sessions dans leur intégralité ; le texte query des autres utilisateurs nécessite d'être membre de pg_read_all_stats (ou superutilisateur). Si la colonne query affiche <insufficient privilege>, c'est la raison.

🔍 Vous avez trouvé la requête lente ? Exécutez-la avec EXPLAIN (ANALYZE, BUFFERS) et collez la sortie dans l'EXPLAIN Visualizer. Vous voulez plutôt l'arrêter ? Voyez comment tuer une requête en toute sécurité.