Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

54001 1С:Предприятие и СУБД

PostgreSQL Error 54001 statement_too_complex: Оптимизация и Решение

Обновлено: 26.08.2026 · Официальная документация ↗
  • Ошибка планировщика: ERROR: 54001: statement too complex.
  • Сбой генерации плана выполнения запроса в оптимизаторе PostgreSQL.
  • Сложные динамические запросы с сотнями условий OR, конструкций CASE WHEN или десятками JOIN не могут быть скомпилированы.
  • Падение тяжелых отчетов или выгрузок в 1С:Предприятие при объединении множества виртуальных таблиц.

1. Декомпозиция монструозных SQL-запросов

Ошибка 54001 возникает, когда дерево разбора (Parse Tree) запроса превышает внутренние лимиты стека и памяти планировщика. Разбейте единый запрос на несколько этапов с использованием временных таблиц:

-- Вместо одного огромного запроса с 50 JOIN:
CREATE TEMPORARY TABLE tmp_stage_1 ON COMMIT DROP AS
SELECT t1.id, t2.val 
FROM table1 t1 
JOIN table2 t2 ON t1.id = t2.ref_id
WHERE t1.created_at >= '2025-01-01';

ANALYZE tmp_stage_1;

SELECT * FROM tmp_stage_1 ts
JOIN table3 t3 ON ts.id = t3.item_id;

2. Оптимизация генерируемых списков IN (...)

Если генератор ORM или код 1С формирует условия с десятками тысяч элементов в секции IN (...), замените их на передачу массива или соединение со временной таблицей:

-- Неэффективно и рискованно для планировщика:
SELECT * FROM orders WHERE id IN (1, 2, 3, ... 100000 элементов);

-- Эффективно:
SELECT * FROM orders WHERE id = ANY('{1, 2, 3, ...}'::bigint[]);

3. Корректировка параметров оптимизатора (GEQO)

При большом количестве объединений (JOIN) стандартный оптимизатор перебирает слишком много вариантов. Убедитесь, что включен генетический оптимизатор запросов GEQO:

-- Проверка статуса GEQO
SHOW geqo;
SHOW geqo_threshold;

-- Включение и настройка порога срабатывания (по умолчанию 12 таблиц)
ALTER SYSTEM SET geqo = 'on';
ALTER SYSTEM SET geqo_threshold = 12;
SELECT pg_reload_conf();

4. Увеличение параметров стека планировщика

-- В postgresql.conf при достаточном системном ulimit -s
ALTER SYSTEM SET max_stack_depth = '7MB';
SELECT pg_reload_conf();
💡 Практика специалистов: Если ошибка 54001 возникает на платформе 1С с включенным RLS (управление доступом на уровне записей), переведите базу на механизм 'Производительный RLS' (доступен в современных версиях платформы), который формирует более компактные SQL-конструкции.

Частые вопросы (FAQ)

Почему 1С генерирует запросы, вызывающие ошибку 54001?

Механизмы компоновки данных (СКД) и запросы с проверкой прав на уровне записей (RLS) генерируют масштабные конструкции с огромным количеством вложенных подзапросов и проверок условий, перегружающих парсер СУБД.

Помогает ли увеличение work_mem при ошибке 54001?

Нет, work_mem отвечает за выполнение операций (сортировка, хеширование), а 54001 возникает на этапе синтаксического разбора и построения плана запроса.

Что такое GEQO и как он помогает избежать сбоев?

Genetic Query Optimizer использует эвристические алгоритмы вместо полного перебора комбинаций соединений, предотвращая экспоненциальный взрыв сложности при планировании запросов с более чем 12 таблицами.

Как локализовать проблемный запрос в логах?

Включите log_min_error_statement = 'error' в postgresql.conf. Полный текст сбойного запроса будет сохранен в системном журнале вместе со стеком вызова.

Полезные материалы
Рекомендуем