MSSQL Ошибка 8623: Query processor ran out of internal resources for query plan
- Запрос аварийно прерывается:
Msg 8623, Level 16, State 1: The query processor ran out of internal resources and could not produce a query plan. - В технологическом журнале 1С фиксируется исключение
Ошибка СУБД: Оптимизатор запросов исчерпал внутренние ресурсы. - Ошибка генерируется при проведении сложных документов с десятками тысяч строк, закрытии месяца или формировании аналитических отчетов с гигантскими конструкциями
IN (...). - Высокое потребление памяти компиляции (Compile Memory) в пуле планов.
1. Декомпозиция гигантских предикатов IN (...) и временных таблиц
В 1С платформа часто транслирует конструкции языка запросов ГДЕ Ссылка В (&Список) в T-SQL запрос с тысячами литералов. Замените списки значений на загрузку во временную таблицу:
-- Антипаттерн, приводящий к ошибке 8623:
-- SELECT * FROM Goods WHERE ID IN (1, 2, 3, ... 10000+ элементов);
-- Решение: Загрузка во временную таблицу с явным кластерным индексом
CREATE TABLE #TempIDs (ID INT NOT NULL PRIMARY KEY CLUSTERED);
INSERT INTO #TempIDs (ID) VALUES (1), (2), (3); -- пакетная вставка
SELECT g.*
FROM dbo.Goods g
INNER JOIN #TempIDs t ON g.ID = t.ID;2. Использование хинтов оптимизатора (QUERYTRACEON / FORCE ORDER)
Если изменить исходный код невозможно (закрытая конфигурация), создайте Plan Guide с указанием не использовать глубокую эвристику:
-- Упрощение дерева оптимизации через хинты
SELECT * FROM ComplexView
OPTION (
RECOMPILE,
FORCE ORDER,
QUERYTRACEON 8621 -- Увеличение стека компилятора запросов
);3. Очистка процедурного кэша и обновление статистики
Устаревшая статистика с высокой плотностью заставляет оптимизатор генерировать экспоненциально сложные деревья соединений:
-- Обновление статистики с полным сканированием проблемных таблиц
UPDATE STATISTICS dbo._Document123 WITH FULLSCAN, NORECOMPUTE;
-- Сброс кэша планов конкретной базы
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;4. Включение флага трассировки 4199
-- Включение исправлений оптимизатора запросов (Query Optimizer Hotfixes)
DBCC TRACEON (4199, -1);
GO
-- Или на уровне конкретной БД (SQL Server 2016+)
ALTER DATABASE CURRENT SET QUERY_OPTIMIZER_HOTFIXES = ON; Частые вопросы (FAQ)
Почему 1С:Предприятие генерирует ошибку 8623?
Платформа 1С формирует динамический SQL. При соединениях десятков регистров, виртуальных таблиц и огромных списков условий в RLS (безопасность на уровне записей) дерево операторов превышает системный лимит оптимизатора по сложности фаз Search 1/Search 2.
Что делает флаг трассировки DBCC TRACEON(8621)?
Флаг 8621 увеличивает размер стека, выделяемого процессу оптимизатора запросов, позволяя компилировать запросы с большей глубиной вложенности деревьев разбора.
Помогает ли увеличение оперативной памяти сервера избавиться от ошибки 8623?
Нет. Лимит internal resources в ошибке 8623 зашит в архитектурные ограничения оптимизатора по глубине графа ветвления, а не в физический объем RAM сервера.
Как найти SQL-текст запроса, вызвавшего ошибку 8623?
Настройте сессию Extended Events с перехватом события error_reported, фильтруя по error_number = 8623 и действием sqlserver.sql_text.