1С и SQL Server: настройка параллелизма и памяти

SQL Server — одна из самых популярных СУБД для 1С:Предприятие. Но стандартные настройки Microsoft оптимизированы под OLAP-системы, а не под транзакционные нагрузки 1С. Результат: тормоза при проведении документов, долгое формирование отчётов, блокировки. Три критичных параметра решают 80% проблем с производительностью: MAXDOP (параллелизм запросов), Cost Threshold (порог включения параллелизма) и Max Server Memory (лимит памяти для SQL Server). Настраиваете их правильно — база летает. Игнорируете — получаете жалобы пользователей и простои.
Эта инструкция — для системных администраторов и DBA, которые обслуживают серверы для 1С. Разберём, как рассчитать оптимальные значения параметров, применить их через SQL Server Management Studio и T-SQL, проверить результат. Все примеры проверены на SQL Server 2017-2022 и работают с любой конфигурацией 1С.
Почему стандартные настройки SQL Server тормозят 1С
Microsoft настраивает SQL Server для аналитических систем: больших выборок данных, сложных JOIN, агрегации миллионов строк. Параллелизм запросов (MAXDOP) по умолчанию равен 0 — это значит «используй все доступные ядра процессора». Порог включения параллелизма (Cost Threshold) = 5 — запрос дешевле 5 единиц выполняется в одном потоке, дороже — в нескольких.
1С работает иначе. Это OLTP-система: тысячи мелких транзакций в секунду, короткие запросы на чтение и запись, много параллельных сеансов. Запуск параллельных потоков для каждого запроса создаёт overhead — процессор тратит время на координацию потоков, а не на выполнение работы. Память расходуется неэффективно: SQL Server резервирует буферы для параллельных операций, которые не нужны.
Конкретный пример. Пользователь проводит документ «Реализация товаров» в Управлении торговлей 11. 1С генерирует 15-20 коротких запросов: обновление остатков, запись движений по регистрам, проверка контрагента. Каждый запрос отрабатывает за 10-50 мс. Но если SQL Server запускает 8 параллельных потоков для каждого, overhead составляет 30-40% времени. Итог: проведение документа занимает 2-3 секунды вместо 0.5 секунды.
Второй момент — память. SQL Server по умолчанию забирает всю доступную оперативную память сервера, оставляя операционной системе минимум. Windows начинает использовать файл подкачки, производительность падает. Правильная настройка Max Server Memory решает проблему.
MAXDOP: сколько потоков нужно 1С
MAXDOP (Maximum Degree Of Parallelism) — максимальное количество процессорных ядер, которые SQL Server использует для выполнения одного запроса. Значение 0 = без ограничений, 1 = один поток, 4 = до четырёх потоков параллельно.
Для 1С оптимальное значение MAXDOP зависит от количества физических ядер процессора:
| Количество физических ядер | Рекомендуемый MAXDOP | Пояснение |
|---|---|---|
| 4 и менее | 1 | Параллелизм не даёт выигрыша |
| 6-8 | 2 | Минимальный параллелизм для тяжёлых отчётов |
| 12-16 | 4 | Баланс между OLTP и редкими OLAP-задачами |
| 20 и более | 4-8 | Можно увеличить для специфических нагрузок |
Важно: считайте физические ядра, а не логические потоки (Hyper-Threading). Процессор Intel Xeon Gold 6226R имеет 16 физических ядер и 32 логических потока — для расчёта берите 16. Узнать количество ядер в Windows Server: откройте Диспетчер задач, вкладка «Производительность», раздел ЦП. Строка «Ядра» показывает физические, «Логические процессоры» — с учётом HT.
В 90% случаев для 1С достаточно MAXDOP = 4. Это золотая середина: короткие транзакционные запросы выполняются быстро, сложные отчёты (закрытие месяца, оборотно-сальдовые ведомости) используют несколько ядер. Если у вас Управление торговлей или Бухгалтерия на 50+ пользователей, начинайте с 4.
Cost Threshold: когда включать параллелизм
Cost Threshold for Parallelism — порог стоимости запроса, после которого SQL Server включает параллельное выполнение. Стоимость измеряется в абстрактных единицах: SQL Server оценивает затраты на чтение данных, сортировку, JOIN. Значение по умолчанию = 5, что абсурдно мало для современных систем.
Для 1С рекомендуется Cost Threshold = 50. Это отсекает 95% коротких запросов от параллелизма и разрешает его только для действительно тяжёлых операций: построение регламентированных отчётов, массовое перепроведение документов, загрузка прайс-листов на 100000+ номенклатур.
Как работает связка MAXDOP и Cost Threshold:
- Запрос дешевле 50 единиц выполняется в одном потоке, независимо от MAXDOP.
- Запрос дороже 50 единиц использует до MAXDOP потоков параллельно.
- Если MAXDOP = 1, параллелизм отключён полностью, Cost Threshold не влияет.
Пример. У вас MAXDOP = 4 и Cost Threshold = 50. Пользователь открывает справочник «Номенклатура» (запрос стоит 12 единиц) — выполнение в одном потоке. Формирует отчёт «Продажи за квартал по регионам» (стоимость 380 единиц) — SQL Server запускает 4 параллельных потока. Это правильное поведение.
Если у вас специфическая конфигурация 1С с кастомными отчётами и сложной аналитикой, можно снизить порог до 30-40. Для типовых конфигураций держите 50.
Max Server Memory: сколько памяти отдать SQL Server
Max Server Memory ограничивает объём оперативной памяти, который SQL Server забирает под буферный пул (buffer pool). Буферный пул — это кеш страниц данных и индексов. Чем больше данных помещается в память, тем меньше обращений к дискам, тем выше скорость.
Но SQL Server жадный: по умолчанию он берёт всю память, оставляя Windows и другим процессам крохи. Результат — операционная система начинает использовать файл подкачки (pagefile.sys), производительность падает в разы. Правильная настройка Max Server Memory обязательна.
Формула расчёта для выделенного сервера баз данных:
Max Server Memory = Общий объём RAM - 4 GB - 10% от RAM
Разбор формулы:
- 4 GB — резерв для операционной системы Windows Server, её служб, системного кеша.
- 10% от RAM — запас для других процессов SQL Server (не входящих в buffer pool): памяти для сортировок, хеш-таблиц, временных объектов, процедурного кеша.
Примеры расчёта:
| Объём RAM сервера | Расчёт | Max Server Memory (MB) |
|---|---|---|
| 16 GB | 16384 - 4096 - 1638 = 10650 | 10650 |
| 32 GB | 32768 - 4096 - 3277 = 25395 | 25395 |
| 64 GB | 65536 - 4096 - 6554 = 54886 | 54886 |
| 128 GB | 131072 - 4096 - 13107 = 113869 | 113869 |
Если на сервере кроме SQL Server работают другие службы (Application Server 1С, веб-сервер IIS, сервер RabbitMQ), уменьшайте Max Server Memory дополнительно. Например, для сервера 32 GB с кластером серверов 1С вычтите ещё 4-6 GB: Max Server Memory = 19000-21000 MB.
Для серверов с памятью 128 GB и выше формула упрощается: отдавайте SQL Server 80-85% RAM. Запас в 15-20% достаточен для ОС и вспомогательных процессов.
Как применить настройки через SQL Server Management Studio
Настройка параметров через графический интерфейс
-
Подключитесь к SQL Server через SSMS. Откройте SQL Server Management Studio, введите имя сервера, выберите аутентификацию Windows или SQL Server (логин sa). Нажмите «Подключить».
-
Откройте свойства сервера. В Object Explorer щёлкните правой кнопкой по имени сервера (верхний узел дерева). Выберите «Свойства» (Properties).
-
Настройте Max Server Memory. Перейдите на вкладку «Память» (Memory). В блоке «Параметры памяти сервера» (Server Memory Options) найдите поле «Максимальный объём памяти сервера» (Maximum server memory). Введите рассчитанное значение в мегабайтах. Например, для сервера 32 GB введите 25395. Не трогайте поле «Минимальный объём» — оставьте 0 (по умолчанию).
-
Настройте MAXDOP и Cost Threshold. Перейдите на вкладку «Дополнительно» (Advanced). Найдите раздел «Параллелизм» (Parallelism). Установите «Максимальная степень параллелизма» (max degree of parallelism) = 4. Установите «Пороговое значение стоимости для параллелизма» (cost threshold for parallelism) = 50.
-
Примените изменения. Нажмите «ОК». SQL Server применяет настройки Max Server Memory немедленно, без перезапуска службы. Параметры MAXDOP и Cost Threshold также вступают в силу сразу — новые запросы начнут использовать новые значения.
-
Проверьте применение. Откройте новое окно запроса (New Query). Выполните проверочный скрипт, чтобы убедиться в корректности настроек (см. раздел ниже).
Настройка через SSMS удобна, но не подходит для автоматизации. Если вы разворачиваете несколько серверов 1С или пишете скрипты для Ansible/PowerShell, используйте T-SQL команды.
Как применить настройки через T-SQL
T-SQL команды позволяют настроить SQL Server из скриптов, удалённо через sqlcmd или из задач автоматизации. Преимущество — воспроизводимость и версионирование конфигурации.
Полный скрипт настройки для типового сервера 1С (32 GB RAM, 8 физических ядер):
-- Установка Max Server Memory = 25395 MB (для 32 GB RAM)
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'max server memory (MB)', 25395;
RECONFIGURE;
-- Установка MAXDOP = 4
EXEC sp_configure 'max degree of parallelism', 4;
RECONFIGURE;
-- Установка Cost Threshold = 50
EXEC sp_configure 'cost threshold for parallelism', 50;
RECONFIGURE;
-- Скрыть расширенные опции (опционально)
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE;
Объяснение команд:
sp_configure 'show advanced options', 1— включает доступ к расширенным параметрам конфигурации. Без этого SQL Server не покажет MAXDOP и Cost Threshold.RECONFIGURE— применяет изменение. Обязательна после каждогоsp_configure.sp_configure 'max server memory (MB)', 25395— устанавливает Max Server Memory. Значение в мегабайтах.sp_configure 'max degree of parallelism', 4— устанавливает MAXDOP.sp_configure 'cost threshold for parallelism', 50— устанавливает Cost Threshold.
Для применения скопируйте код в SSMS (New Query), подставьте свои значения Max Server Memory, нажмите F5 (Execute). Скрипт выполнится за 1-2 секунды. Перезагрузка SQL Server не требуется.
Если у вас несколько экземпляров SQL Server (named instances) на одном физическом сервере, настраивайте Max Server Memory индивидуально для каждого. Сумма всех Max Server Memory не должна превышать 80% физической памяти сервера.
Как проверить текущие настройки и использование памяти
После применения настроек проверьте, что SQL Server использует корректные значения. Выполните запрос в SSMS:
-- Проверка всех ключевых параметров
SELECT
name AS ParameterName,
value_in_use AS CurrentValue,
description AS Description
FROM sys.configurations
WHERE name IN (
'max server memory (MB)',
'min server memory (MB)',
'max degree of parallelism',
'cost threshold for parallelism'
)
ORDER BY name;
Результат покажет таблицу с четырьмя строками. Проверьте колонку CurrentValue:
max server memory (MB)— должно совпадать с рассчитанным значением.max degree of parallelism— должно быть 4 (или ваше значение).cost threshold for parallelism— должно быть 50.
Если значения не совпадают, проверьте, выполнили ли вы RECONFIGURE после каждого sp_configure.
Дополнительно проверьте реальное потребление памяти SQL Server:
-- Использование памяти буферным пулом
SELECT
(physical_memory_in_use_kb / 1024) AS UsedMemoryMB,
(locked_page_allocations_kb / 1024) AS LockedPagesMB,
(total_virtual_address_space_kb / 1024) AS VirtualAddressSpaceMB
FROM sys.dm_os_process_memory;
Колонка UsedMemoryMB показывает, сколько памяти SQL Server занял в данный момент. После перезапуска службы это значение близко к 0, затем постепенно растёт до Max Server Memory по мере кеширования данных. Если UsedMemoryMB больше Max Server Memory, проверьте настройки — возможно, параметр не применился.
Типовые конфигурации серверов для 1С с SQL Server
Подбор аппаратной конфигурации влияет на производительность базы 1С не меньше, чем настройки SQL Server. Рекомендуемые параметры для разных нагрузок:
| Количество пользователей | Процессор | RAM | Накопители | MAXDOP | Max Server Memory (MB) |
|---|---|---|---|---|---|
| До 10 | Intel Xeon E-2334 (4 ядра) | 16 GB | 2x SSD SATA 480 GB RAID 1 | 1 | 10650 |
| 10-30 | Intel Xeon Silver 4310 (12 ядер) | 32 GB | 2x SSD NVMe 960 GB RAID 1 | 4 | 25395 |
| 30-80 | Intel Xeon Gold 5320 (26 ядер) | 64 GB | 4x SSD NVMe 1.92 TB RAID 10 | 4 | 54886 |
| 80-150 | Intel Xeon Gold 6338 (32 ядра) | 128 GB | 4x SSD NVMe 3.84 TB RAID 10 | 4-8 | 113869 |
Важные моменты при выборе процессоров:
- Для 1С важнее частота ядер, чем их количество. Xeon Gold 5320 (2.2 GHz, 26 ядер) даст меньший прирост, чем Gold 6338 (2.0 GHz базовая, 3.2 GHz Turbo, 32 ядра).
- Hyper-Threading включайте — 1С хорошо утилизирует логические потоки.
- Для малых баз (до 30 пользователей) подходят процессоры линейки Xeon E (одно сокет). Для средних и крупных нужны Scalable (два сокета).
Требования к оперативной памяти:
- Минимум 16 GB для баз до 10 пользователей. Меньше — SQL Server начнёт сбрасывать данные из кеша, производительность упадёт.
- Для активных баз (торговля, производство) берите в 1.5 раза больше размера файлов данных. База 1С занимает 30 GB → ставьте 48 GB RAM.
- Используйте модули памяти с коррекцией ошибок (ECC RDIMM). Некорректированные ошибки в памяти приводят к повреждению данных в SQL Server.
Требования к накопителям:
- Файлы базы данных (.mdf) и журнал транзакций (.ldf) размещайте на разных дисках или RAID-массивах. Это снижает конкуренцию за операции чтения-записи.
- Для баз 1С критична скорость случайных операций (IOPS). SSD NVMe даёт 50-100x выигрыш по сравнению с HDD. SATA SSD — минимальный приемлемый уровень.
- RAID 10 предпочтительнее RAID 5/6 для транзакционных баз: выше скорость записи, ниже нагрузка на контроллер.
Частые ошибки при настройке SQL Server для 1С
Ошибка 1: MAXDOP = 0 (без ограничений). SQL Server пытается использовать все ядра для каждого запроса. На сервере с 32 ядрами это приводит к гигантскому overhead: координация потоков занимает больше времени, чем выполнение запроса. Производительность падает в 2-3 раза по сравнению с MAXDOP = 4.
Ошибка 2: Max Server Memory не ограничен (2147483647 MB). SQL Server забирает всю память, Windows начинает использовать pagefile, производительность системы падает. Пользователи жалуются на тормоза не только в 1С, но и в RDP-сессиях, браузерах, Outlook. Решение: установите Max Server Memory по формуле из этой статьи.
Ошибка 3: Слишком низкий Cost Threshold (5-10). Параллелизм включается для каждого запроса, даже для чтения одной строки из справочника. Overhead убивает производительность. Признак проблемы: в системном мониторе SQL Server (Performance Monitor) счётчик Batch Requests/sec высокий (1000+), а SQL Compilations/sec тоже высокий (300+). Решение: Cost Threshold = 50.
Ошибка 4: Файлы базы данных и журнала на одном диске. SQL Server одновременно пишет транзакции в журнал (.ldf) и изменяет страницы данных (.mdf). Если оба файла на одном диске, головки жёсткого диска мечутся между областями, задержки растут. На SSD NVMe проблема менее критична, но всё равно есть. Решение: разносите .mdf и .ldf на разные RAID-массивы или логические диски.
Ошибка 5: Игнорирование статистики и индексов. Настройка MAXDOP и памяти не поможет, если в базе 1С кривая статистика или отсутствуют индексы. SQL Server выбирает неоптимальные планы запросов, производительность низкая. Решение: регулярно (раз в неделю) запускайте обновление статистики через встроенную обработку 1С «Реструктуризация таблиц» или T-SQL команду UPDATE STATISTICS. Для крупных баз используйте Ola Hallengren Maintenance Solution.
Ошибка 6: Использование SQL Server Express для боевых баз. Express-редакция ограничена 10 GB на базу данных, 1 GB RAM и 4 ядрами процессора. Для продуктивной работы 1С это неприемлемо. Используйте минимум SQL Server Standard Edition. Для баз 50+ пользователей нужна Enterprise Edition (снимает ограничения на память и ядра).
Мониторинг производительности после настройки
После применения настроек отслеживайте ключевые метрики SQL Server. Это позволит обнаружить проблемы до жалоб пользователей и скорректировать конфигурацию.
Метрики процессора:
Processor: % Processor Time— загрузка CPU. Норма для сервера 1С: 40-60% в пиковые часы, до 80% во время закрытия периода. Если стабильно выше 90%, процессору не хватает мощности.SQL Server: SQL Statistics - Batch Requests/sec— количество запросов в секунду. Показатель нагрузки. Для 30 пользователей типично 500-1500 запросов/сек.
Метрики памяти:
SQL Server: Memory Manager - Total Server Memory (KB)— память, занятая SQL Server. Должна расти до Max Server Memory и стабилизироваться.SQL Server: Buffer Manager - Page life expectancy— сколько секунд страница данных живёт в кеше перед вытеснением. Норма: выше 300 секунд. Если меньше 100, памяти недостаточно — увеличивайте RAM.Memory: Available MBytes— свободная память Windows. Должна быть 2-4 GB. Если падает ниже 500 MB, SQL Server взял слишком много — уменьшите Max Server Memory.
Метрики дисков:
Physical Disk: Avg. Disk sec/ReadиAvg. Disk sec/Write— задержки дисковой подсистемы. Норма для SSD NVMe: до 5 мс. Для SATA SSD: до 15 мс. Если выше 50 мс, диски перегружены или деградировали.SQL Server: SQL Statistics - SQL Compilations/sec— сколько раз в секунду SQL Server компилирует новые планы запросов. Должно быть в 5-10 раз меньше, чем Batch Requests/sec. Если соотношение 1:2, проблема с кешем планов — увеличивайте Max Server Memory.
Используйте Performance Monitor (perfmon.exe) для сбора метрик или настройте мониторинг через Zabbix, Prometheus, SQL Server Management Studio (Activity Monitor).
Дополнительные настройки для продвинутых сценариев
Если базовые настройки (MAXDOP, Cost Threshold, Max Server Memory) применены, но производительность недостаточна, рассмотрите дополнительные параметры SQL Server.
Optimize for Ad Hoc Workloads. 1С генерирует множество уникальных запросов (ad hoc queries). SQL Server кеширует полные планы выполнения для каждого, расходуя память. Опция optimize for ad hoc workloads заставляет SQL Server кешировать только компактные «заглушки» (stubs) при первом выполнении, экономя 30-40% памяти процедурного кеша.
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'optimize for ad hoc workloads', 1;
RECONFIGURE;
Эта настройка рекомендуется для всех серверов 1С.
Max Worker Threads. SQL Server создаёт рабочие потоки (worker threads) для обработки запросов. По умолчанию значение рассчитывается автоматически: 512 потоков для серверов до 32 ядер, 1024 для больших систем. Для 1С с высоким параллелизмом (100+ одновременных сеансов) можно увеличить до 2048.
EXEC sp_configure 'max worker threads', 2048;
RECONFIGURE;
Применяйте только если видите ошибки «Scheduler could not spawn worker thread» в логах SQL Server.
Trace Flag 1117 и 1118. В SQL Server 2016+ они включены по умолчанию, но в 2014 и старше нужно активировать вручную. TF 1117 заставляет файлы базы данных расти пропорционально (все файлы в файловой группе увеличиваются одновременно). TF 1118 использует единообразные экстенты (uniform extents) для временных таблиц, снижая фрагментацию tempdb.
DBCC TRACEON(1117, 1118, -1);
Флаг -1 применяет trace flag глобально. Для постоянного включения после перезапуска добавьте параметры запуска в SQL Server Configuration Manager: -T1117;-T1118.
Файлы tempdb. База tempdb используется для сортировок, временных таблиц, хранения промежуточных результатов. В SQL Server 2016+ по умолчанию создаётся 8 файлов tempdb. Если у вас 2014 или старше, создайте несколько файлов вручную (по количеству физических ядер, но не больше 8). Это снижает конкуренцию за ресурсы tempdb.
Частые вопросы
Нужно ли перезагружать SQL Server после изменения MAXDOP и Max Server Memory?
Нет. Параметры MAXDOP, Cost Threshold и Max Server Memory применяются динамически через команду RECONFIGURE. Новые значения вступают в силу немедленно. Перезапуск службы SQL Server не требуется. Единственное исключение — изменение параметров запуска (startup parameters), например, добавление trace flags. Для этого нужен рестарт службы через SQL Server Configuration Manager.
Можно ли установить разные значения MAXDOP для разных баз данных на одном сервере?
Параметр MAXDOP устанавливается на уровне экземпляра SQL Server (instance level), а не базы данных. Но в SQL Server 2017+ можно задать MAXDOP для конкретной базы через ALTER DATABASE SCOPED CONFIGURATION. Пример: ALTER DATABASE MyBase SET MAXDOP = 2;. Это удобно, если на одном сервере работают база 1С (MAXDOP = 4) и аналитическая база (MAXDOP = 8). В версиях 2016 и старше используйте hint OPTION (MAXDOP N) в критичных запросах.
Что делать, если после настройки производительность ухудшилась?
Сначала проверьте, корректно ли применились настройки: выполните запрос SELECT name, value_in_use FROM sys.configurations WHERE name IN ('max server memory (MB)', 'max degree of parallelism', 'cost threshold for parallelism');. Если значения правильные, но производительность упала, возможно, ваша база имеет специфические тяжёлые отчёты, которым нужен параллелизм. Попробуйте увеличить MAXDOP до 6-8 или снизить Cost Threshold до 30. Соберите данные Performance Monitor за несколько часов работы, проанализируйте метрики CPU, памяти, дисков. Если проблема осталась, откатите настройки к предыдущим значениям и проведите детальную диагностику через SQL Server Profiler или Extended Events.
Поделиться статьёй:
Об авторе

Подбор и консалтинг · Экономика и выбор
Консультант по подбору серверного оборудования. 7 лет помогает компаниям выбирать серверы под задачи и бюджет. Сторонник разумной экономии.
Все статьи автора →Похожие материалы
Глава 14: Reviews
Отзывы Поделитесь своим опытом использования продуктов StarTech.com, включая применение и настройку продуктов, что вам нравится в продуктах и области для улучшения. StarTech.com Ltd. 45 Artisans...
Глава 13: Hard-to-find made easy. At StarTech.com, that isn't a slogan. It's a promise.
Труднодоступное стало простым. В StarTech.com это не слоган. Это обещание. StarTech.com — ваш универсальный источник всех необходимых компонентов для подключения. От новейших технологий до...
Глава 12: Limitation of Liability
Ограничение ответственности Ни при каких обстоятельствах ответственность StarTech.com Ltd. и StarTech.com USA LLP (или их должностных лиц, директоров, сотрудников или агентов) за любые убытки...