Requête / job de longue durée
Symptôme
Une seule requête/un seul job tourne depuis des heures sans se terminer ; il consomme des ressources ou affecte les autres.
1. Identifiez la requête et sa durée
Quelle requête, depuis combien de temps tourne-t-elle, quel utilisateur/quelle application ?
Oracle
SELECT sid, serial#, sql_id, last_call_et/60 running_min, username FROM v$session WHERE status='ACTIVE' AND type='USER' ORDER BY last_call_et DESC;PostgreSQL
SELECT pid, now()-query_start dur, usename, query FROM pg_stat_activity WHERE state='active' ORDER BY query_start;MySQL
SELECT id, user, time, state, info FROM information_schema.processlist WHERE command='Query' ORDER BY time DESC;SQL Server
SELECT session_id, total_elapsed_time/1000 sec, status, command FROM sys.dm_exec_requests WHERE session_id IN (SELECT session_id FROM sys.dm_exec_sessions WHERE is_user_process = 1) ORDER BY total_elapsed_time DESC;MongoDB
db.currentOp({ active: true, secs_running: { $gt: 60 } })2. Progresse-t-elle ou est-elle bloquée
S'exécute-t-elle vraiment, ou attend-elle un verrou ? Consultez les indicateurs de progression (Oracle v$session_longops, vues PG pg_stat_progress_*). Si elle attend, passez au playbook Blocages.
Oracle
SELECT sid, opname, sofar, totalwork, ROUND(sofar/NULLIF(totalwork,0)*100,1) pct, time_remaining FROM v$session_longops WHERE sofar<totalwork;PostgreSQL
SELECT * FROM pg_stat_progress_create_index; -- or pg_stat_progress_vacuum / _cluster / _analyze3. Décidez : attendre ou annuler
Si elle progresse et va bientôt se terminer, attendez (le coût du rollback d'une annulation peut prendre encore plus de temps). Si elle est bloquée, s'exécute de manière incorrecte ou affecte la production, terminez-la. Tenez compte de la durée du rollback avant d'annuler.
4. Terminez-la si nécessaire
Préférez annuler uniquement la requête (en conservant la session) ; si cela ne fonctionne pas, tuez la session.
Oracle
ALTER SYSTEM CANCEL SQL 'sid,serial#'; -- 18c+; otherwise KILL SESSIONPostgreSQL
SELECT pg_cancel_backend(pid); -- otherwise pg_terminate_backend(pid)MySQL
KILL QUERY <id>;SQL Server
KILL <session_id>;MongoDB
db.killOp(<opid>)5. Corrigez durablement
Optimisez la requête (index, plan, pagination/traitement par lots), déplacez les jobs lourds hors des heures de pointe et, si besoin, exécutez-les par morceaux. Pour les rapports récurrents, envisagez une vue matérialisée / un réplica en lecture.