PostgreSQL Error 54000 program_limit_exceeded: Решение проблемы
- Запрос аварийно прерывается с ошибкой
ERROR: 54000: program limit exceeded. - Сбои сложных иерархических отчетов в 1С при выполнении бесконечных или глубоких рекурсий.
- Падение операций создания индексов или группировок при превышении лимитов структур данных.
- Отказ выполнения динамически сгенерированных аналитических SQL-запросов.
1. Анализ текста ошибки и первопричины
Код 54000 является базовым для класса переполнения программных лимитов. Точная причина всегда детализируется в сопровождающем сообщении лога (например, превышение глубины стека, размера кортежа или лимита структур).
grep -E "54000|limit exceeded" /var/log/postgresql/postgresql-*.log2. Устранение зацикливания в рекурсивных запросах (Recursive CTE)
Самая частая причина ошибки — зацикливание рекурсивного обхода деревьев/справочников. Добавьте ограничение глубины рекурсии или проверку циклов:
-- Безопасный рекурсивный запрос с ограничением глубины и защитой от зацикливания
WITH RECURSIVE hierarchy_tree AS (
SELECT id, parent_id, 1 AS depth, ARRAY[id] AS path
FROM catalog_items WHERE parent_id IS NULL
UNION ALL
SELECT c.id, c.parent_id, h.depth + 1, h.path || c.id
FROM catalog_items c
JOIN hierarchy_tree h ON c.parent_id = h.id
WHERE NOT c.id = ANY(h.path) -- Защита от бесконечного цикла
AND h.depth < 100 -- Защита от превышения лимита вызовов
)
SELECT * FROM hierarchy_tree;
3. Настройка глубины стека ядра (max_stack_depth)
Если сложные вложенные функции падают из-за безопасного лимита стека, скорректируйте max_stack_depth в postgresql.conf (значение должно быть минимум на 1MB меньше системного ulimit -s):
# Проверка системного лимита в Linux (обычно 8192KB)
ulimit -s
-- Увеличение лимита в postgresql.conf (например, до 6MB при ulimit 8MB)
ALTER SYSTEM SET max_stack_depth = '6MB';
SELECT pg_reload_conf();
4. Оптимизация тяжелых сортировок и группировок
При нехватке памяти для построения внутренних хеш-таблиц увеличьте work_mem для проблемной сессии:
SET work_mem = '256MB';
Частые вопросы (FAQ)
Каковы жесткие фундаментальные ограничения PostgreSQL?
Максимальный размер базы данных — неограничен; максимальный размер таблицы — 32 TB; максимальный размер одной строки (tuple) — 1.6 TB (с TOAST); максимальное количество колонок в таблице — 250-1600 (в зависимости от типов); лимит аргументов функции — 100.
Чем грозит слишком высокое значение max_stack_depth?
Если установить max_stack_depth выше фактического размера стека операционной системы (ulimit -s), то при возникновении глубокой рекурсии процесс PostgreSQL аварийно завершится по Segmentation Fault (SIGSEGV), что приведет к перезапуску всего сервера.
Как эта ошибка проявляется в 1С:Предприятие?
В 1С она возникает при расчете себестоимости, закрытии месяца или формировании дерева спецификаций, если в номенклатуре или подразделениях возникла циклическая ссылка (узел ссылается сам на себя).
Можно ли обойти лимит 54000 простым добавлением RAM?
Нет. Лимиты класса 54000 являются программными константами ядра PostgreSQL или защитными предохранителями от бесконечных циклов. Проблема решается оптимизацией алгоритма запроса.