Главная / Справочник ошибок / PostgreSQL
Запрос не уложился в разрешённое время
ERROR: canceling statement due to statement timeout
Ошибка 57014 «canceling statement due to statement timeout» в PostgreSQL под Directum RX: запрос шёл дольше statement_timeout и был прерван. Как найти медленный запрос и почему не стоит просто поднимать таймаут.
Что это значит
В PostgreSQL задан statement_timeout: на уровне сервера, базы, роли или самим приложением. Запрос, который идёт дольше, база прерывает с кодом 57014. В Directum RX это видно как «could not execute query» с этим кодом внутри, а пользователь получает ошибку на операции.
Вариант той же ошибки: canceling statement due to user request, когда запрос отменило само приложение по своему таймауту.
Как проверить
- Где задан таймаут:
select name, setting, source from pg_settings where name = 'statement_timeout';
select rolname, rolconfig from pg_roles where rolconfig is not null;
- Какие запросы долгие:
select round(mean_exec_time) ms, round(max_exec_time) max_ms, calls, left(query, 120)
from pg_stat_statements order by max_exec_time desc limit 20;
- План медленного запроса через
explain (analyze, buffers)на копии или в тихое время.
Что сделать
- Ускорить запрос: чаще всего не хватает индекса на столбец из условия или соединения. Проверить, нет ли ожидания блокировок: тогда запрос не медленный, а ждёт.
- Если запрос тяжёлый по природе (отчёт, массовая операция), задать больший таймаут только для этой роли или сессии, а не для всей базы.
- Не отключать таймаут совсем: без него один запрос может держать ресурсы часами.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать