Долгий запрос / задание
Симптом
Один запрос/задание выполняется часами и не завершается; потребляет ресурсы или мешает другим.
1. Зафиксируйте запрос и его длительность
Какой запрос, сколько он уже выполняется, какой пользователь/приложение?
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. Выполняется или завис
Он действительно выполняется или ждёт блокировку? Смотрите индикаторы прогресса (Oracle v$session_longops, представления PG pg_stat_progress_*). Если ждёт — переходите к сценарию Blocking.
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. Решите: ждать или отменять
Если запрос продвигается и скоро завершится, подождите (стоимость отката при отмене может сделать его ещё дольше). Если он завис, работает неправильно или мешает production, завершите его. Перед отменой учтите время отката.
4. При необходимости завершите
Предпочтительно отменить только запрос (сохранив сессию); если это не помогает, завершите сессию.
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. Исправьте окончательно
Оптимизируйте запрос (индекс, план, постраничная/пакетная обработка), перенесите тяжёлые задания на непиковые часы и при необходимости выполняйте их частями. Для повторяющихся отчётов рассмотрите materialized view / реплику для чтения.