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
state—activesignifie en cours d'exécution à l'instant présent.idledésigne une session connectée qui ne fait rien (c'est pourquoi on la filtre).idle in transactionmérite votre attention : elle conserve des verrous et bloque le vacuum tout en ne faisant rien.query— la requête en cours pour les sessions actives, mais la dernière requête pour les sessions inactives. Une requête à côté destate = 'idle'est déjà terminée ; ne la poursuivez pas.wait_event_type— une valeur non nulle indique que la requête attend, elle ne calcule pas.Locksignifie qu'elle est bloquée par une autre transaction ;IOsignifie qu'elle lit ou écrit.- Le texte des requêtes longues est tronqué à
track_activity_query_sizeoctets (1024 par défaut) — augmentez cette valeur si votre ORM génère des romans.
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é.
