Как правильно настроить параметр параллелизма MAXDOP в MS SQL Server для баз 1С

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При настройке сервера СУБД Microsoft SQL Server под нужды платформы 1С:Предприятие администраторы часто сталкиваются с вопросом правильной установки степени параллелизма запросов. Неверная конфигурация этих параметров может приводить к снижению общей производительности системы, появлению взаимоблокировок и нерациональному расходу ресурсов процессора. Разберем по шагам, как устроен параллелизм в SQL Server, почему при попытке задать значение 1 интерфейс может сбрасывать его на 128, и какие настройки считаются оптимальными для учетных систем 1С.

Различие между параметрами Max Degree of Parallelism и Max Worker Threads

Проанализируем распространенную ошибку, возникающую при настройке через графическую консоль SQL Server Management Studio (SSMS). Если при попытке ввести значение 1 параметр автоматически меняется на 128, значит, изменение вносится не в ту опцию сервера:

  1. Max Worker Threads (Максимальное число рабочих потоков) — определяет общий пул системных потоков для всех входящих подключений и задач SQL Server. У этого параметра есть жесткое аппаратное минимальное ограничение (для 64-битных систем базовый порог составляет именно 128). При попытке указать число меньше допустимого минимума интерфейс принудительно сбрасывает значение. Для данного параметра рекомендуется оставлять значение по умолчанию 0 (автоматический расчет).
  2. Max Degree of Parallelism (MAXDOP / Максимальная степень параллелизма) — указывает предельное число процессорных ядер, которые оптимизатор запросов может выделить на выполнение одного отдельного плана запроса. Именно этот параметр регулирует параллелизм в базах 1С и может принимать значения от 0 до числа доступных ядер.

Установка степени параллелизма через T-SQL

Для гарантированного применения настроек и исключения ошибок интерфейса воспользуемся системной хранимой процедурой sp_configure. Выполним следующий скрипт в среде Management Studio с правами администратора:


sp_configure 'show advanced options', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
sp_configure 'max degree of parallelism', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
sp_configure 'max degree of parallelism';
GO

Посмотрим на результат выполнения: процедура применит глобальное ограничение, запрещающее параллельное исполнение пользовательских запросов, и выведет текущее состояние конфигурации.

Почему для 1С часто рекомендуется MAXDOP = 1

В официальных рекомендациях фирмы 1С и материалах ИТС содержится совет устанавливать MAXDOP = 1 для типовых сценариев работы. Выясним причину такого подхода:

  1. Специфика OLTP-нагрузки: платформа 1С генерирует большое количество коротких транзакционных запросов на чтение и запись. Накладные расходы на распараллеливание (координация дочерних потоков, разбиение и склеивание данных) часто превышают время фактического выполнения самого запроса.
  2. Внутризапросные взаимоблокировки (Intra-query deadlocks): при параллельном выполнении сложных запросов с обращением к временным таблицам разные потоки одной и той же сессии могут блокировать друг друга при попытке получить доступ к общим структурам.
  3. Ожидания синхронизации потоков: если один из параллельных потоков получает меньше ресурсов или задерживается дисковой подсистемой, остальные потоки вынуждены простаивать, порождая высокие ожидания типа CXPACKET.

Альтернативный вариант: настройка Cost Threshold for Parallelism

Полный запрет параллелизма (MAXDOP = 1) может замедлить выполнение регламентных ночных процедур, таких как перестроение индексов, сбор статистики или расчет тяжелых аналитических отчетов в базах данных крупного масштаба. В таких случаях рассмотрим сбалансированный вариант тонкой настройки:

  1. Расчет значения MAXDOP: если на сервере несколько ядер, значение вычисляется по количеству физических ядер одного NUMA-узла (сокета), но обычно не более 8 (например, для 8-ядерного процессора устанавливаем MAXDOP = 4 или 8, исключая учет виртуальных потоков Hyper-Threading).
  2. Увеличение порога стоимости (Cost Threshold for Parallelism): по умолчанию порог равен 5, что заставляет SQL Server распараллеливать даже легкие запросы. Для систем на платформе 1С этот параметр рекомендуется повысить до диапазона 25–50. В таком случае простые транзакции будут выполняться строго на одном ядре, а параллелизм включится только для действительно тяжелых выборок.

Применим комплексную настройку с помощью T-SQL:


sp_configure 'show advanced options', 1;
GO
RECONFIGURE WITH OVERRIDE;
GO
sp_configure 'cost threshold for parallelism', 25;
GO
sp_configure 'max degree of parallelism', 4;
GO
RECONFIGURE WITH OVERRIDE;
GO

Тонкая настройка на уровне отдельных баз и регламентных заданий

Начиная с версии SQL Server 2016 появилась возможность настраивать параллелизм индивидуально для каждой базы, не затрагивая настройки всего экземпляра сервера. Разберем выполнение команды переопределения конфигурации уровня базы данных:

ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 1;

Если для основной учетной базы выставлено значение MAXDOP = 1, регламентные ночные скрипты обслуживания (дефрагментацию и переиндексацию таблиц) можно ускорить, принудительно задавая хинт параллелизма внутри скрипта обслуживания индекса:

ALTER INDEX ALL ON dbo._Document123 REBUILD WITH (MAXDOP = 8);

Таким образом, базовым и наиболее безопасным решением для большинства баз 1С:Предприятие является установка MAXDOP = 1, а для высоконагруженных систем с тяжелой аналитикой — расчет значения по NUMA-узлам с обязательным увеличением порога cost threshold for parallelism.

← На главную