Почему MS SQL Server 2017 работает медленнее 2016 в связке с 1С и как это исправить?

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

При обновлении системного окружения многие администраторы и разработчики 1С сталкиваются с парадоксальной ситуацией: более свежая версия СУБД (в данном случае MS SQL Server 2017) показывает результаты в тестах производительности (например, тест Гилева) значительно хуже, чем предыдущая версия SQL Server 2016. Особенно остро это проявляется при параллельной нагрузке, когда показатели «попугаев» могут падать в два и более раз. В этой статье мы подробно разберем причины такого поведения и выясним, какие настройки необходимо изменить для стабилизации работы системы.

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

Рассмотрим ситуацию на конкретном примере. При одиночном тесте (без нагрузки) SQL Server 2017 может показывать даже лучшие результаты, чем 2016-я версия. Однако, как только начинается параллельная обработка данных, производительность резко снижается. Пользователи отмечают 100% загрузку процессора при аномально низком потреблении оперативной памяти и минимальной нагрузке на дисковую подсистему. Это классический симптом того, что сервер тратит ресурсы не на выполнение запросов, а на их планирование и управление ресурсами.

Выясним основные причины, по которым 17-я версия может «захлебываться» там, где 16-я работала стабильно:

  1. Адаптивная обработка запросов (Adaptive Query Processing): В версии 2017 появилась функция Memory Grant Feedback. Если SQL Server считает, что запросу нужно меньше памяти, чем было выделено ранее, он урезает лимит. В динамической среде 1С это часто приводит к тому, что запросу не хватает памяти для выполнения Sort или Hash Join, и данные начинают сбрасываться в TempDB, вызывая простои.
  2. Новый Cardinality Estimator (Оценщик мощности): Начиная с версии 2014, Microsoft внедрила новую модель оценки количества строк. Для сложных запросов 1С, использующих вложенные запросы и временные таблицы, эта модель часто строит неоптимальные планы.
  3. Механизм Indirect Checkpoints: По умолчанию в новых версиях параметр TARGET_RECOVERY_TIME установлен в 60 секунд, что заставляет систему чаще сбрасывать «грязные» страницы на диск, создавая дополнительную нагрузку на CPU.

Шаг 1. Настройка модели оценки мощностей (Cardinality Estimation)

Проанализируем работу оптимизатора. В большинстве случаев для стабильной работы 1С требуется вернуть логику работы оптимизатора к «старой» модели (Legacy), которая более предсказуемо обрабатывает специфические запросы платформы. Посмотрим, как это сделать на уровне базы данных.

Выполним следующую команду для изменения настроек конфигурации базы данных:


ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = ON;
GO

Это позволит использовать проверенные алгоритмы оценки, которые корректно работают с временными таблицами 1С, не заставляя процессор пересчитывать планы при каждом изменении объема данных.

Шаг 2. Использование флагов трассировки для оптимизации

Разберем использование специальных флагов трассировки, которые являются «золотым стандартом» для настройки SQL под 1С. Флаги позволяют принудительно включить или выключить определенные механизмы ядра СУБД.

Флаг трассировки 4199: Данный флаг включает все исправления оптимизатора запросов, которые были выпущены в различных обновлениях (Hotfix). Для современных версий SQL это критически важно.

Флаг трассировки 9481: Если изменение LEGACY_CARDINALITY_ESTIMATION на уровне базы не помогло, этот флаг принудительно включает старую модель оценщика на уровне всего сервера.

Для включения флагов необходимо добавить их в параметры запуска службы SQL Server (SQL Server Configuration Manager) в формате -T4199 и -T9481, либо выполнить команду:


DBCC TRACEON (4199, 9481, -1);
GO

Шаг 3. Параметры параллелизма и TempDB

Проанализируем настройки параллелизма. Несмотря на то что автор темы использовал MAXDOP = 1, в SQL Server 2017 работа с TempDB претерпела изменения. Рассмотрим рекомендации по настройке для многопоточной нагрузки:

  1. Max Degree of Parallelism (MAXDOP): Для 1С рекомендуется устанавливать значение 1. Это исключает разделение одного запроса на несколько ядер, что часто вызывает блокировки типа CXPACKET.
  2. Cost Threshold for Parallelism: Если вы все же используете параллелизм (MAXDOP > 1), поднимите порог стоимости с 5 до 50. Это предотвратит попытки SQL распараллеливать даже самые простые запросы.
  3. Количество файлов TempDB: Убедитесь, что количество файлов данных TempDB соответствует числу логических ядер (но не более 8, если ядер больше). Это критически важно для снижения задержек на системных страницах PFS и SGAM.

Шаг 4. Особенности работы на ноутбуках и старом железе

Выясним причину высокой загрузки CPU при низкой нагрузке на диск на «стареньких» ноутбуках. SQL Server 2017 активно использует современные инструкции процессора (AVX2). Если ваш процессор (например, Sandy Bridge) их поддерживает, но система охлаждения не рассчитана на длительную пиковую нагрузку, срабатывает троттлинг.

В отличие от 2016-го сервера, 2017-й может более агрессивно использовать механизмы Soft-NUMA, пытаясь автоматически разделить физические ядра на логические узлы. На процессорах с небольшим количеством ядер это создает лишние накладные расходы на переключение контекста. Попробуем отключить автоматический Soft-NUMA, если вы наблюдаете неадекватное распределение нагрузки по ядрам.

Итоги и рекомендации

Если вы решили остаться на MS SQL Server 2017 или планируете переход, выполните следующие действия для достижения производительности уровня 2016-й версии и выше:

Таким образом, падение производительности в 2017 версии не является «приговором» или признаком того, что версия плохая. Это результат внедрения новых «умных» алгоритмов, которые пока еще не идеально адаптированы под специфическую архитектуру запросов 1С. Тщательная настройка позволит вам использовать преимущества ядра 2017 года без потери скорости.

← На главную