В практике администрирования баз данных 1С часто встречается парадоксальная ситуация: системный администратор меняет значение настройки Max Degree of Parallelism (MAXDOP) в свойствах SQL Server, и база внезапно начинает «летать». Однако радость длится недолго — через день или два производительность снова падает. В этой статье мы разберем, почему «передергивание» настроек дает лишь временный эффект, как на самом деле работают планы запросов и как настроить сервер для стабильной работы.
Проанализируем ситуацию, описанную пользователем: изменение параметра MAXDOP с 4 на 1 (и даже обратно с 1 на 4) мгновенно ускоряет поиск. На самом деле, дело не в магическом значении единицы или четверки. В SQL Server выполнение любой команды через sp_configure с последующим RECONFIGURE приводит к глобальному событию — очистке процедурного кэша. Это эквивалентно выполнению команды DBCC FREEPROCCACHE.
Когда мы очищаем кэш, SQL Server удаляет все старые планы выполнения запросов. При следующем обращении пользователя система вынуждена построить план заново, используя самые свежие данные из статистик. Если старый план был неоптимальным (например, из-за изменения объема данных в таблице), новый план, скорее всего, будет гораздо эффективнее. Однако со временем, когда статистика снова станет неактуальной или произойдет «залипание» неудачного плана, проблема вернется. Таким образом, изменение MAXDOP — это не решение, а лишь способ принудительно заставить сервер пересмотреть свои планы.
Одной из главных причин, по которой запрос на поиск физлица вдруг начинает выполняться 4 секунды вместо миллисекунд, является Parameter Sniffing (подсматривание параметров). Рассмотрим подробнее, как это происходит:
Выясним причину, почему статистика так важна. Оптимизатор SQL Server — это стоимостная модель. Он не «видит» реальные данные, он видит только «вероятности», записанные в гистограммах статистики. Если статистика устарела, оптимизатор может решить, что в таблице 100 строк, хотя их там уже миллион. В результате он выберет крайне неэффективный метод соединения таблиц или способ обхода индексов.
Обновление статистик само по себе не всегда помогает мгновенно. Важный нюанс: после выполнения UPDATE STATISTICS SQL Server помечает связанные планы запросов как неактуальные, но делает это не всегда агрессивно. Как показывает практика (и сообщения опытных администраторов), в ряде случаев старый «плохой» план может продолжать использоваться до тех пор, пока не будет выполнена полная очистка кэша или ручная перекомпиляция запроса.
Хотя изменение этого параметра не является «лекарством» от всех болезней, существуют жесткие рекомендации для сред 1С. Разберем по шагам, почему для 1С традиционно советуют MAXDOP = 1:
CXPACKET) часто превышают время самого выполнения.Для современных многоядерных серверов и актуальных версий SQL Server (2016+) можно использовать более гибкий подход: оставить MAXDOP в значении 1, но настроить Cost Threshold for Parallelism. Посмотрите на пример настройки:
EXEC sys.sp_configure N'show advanced options', N'1';
RECONFIGURE;
EXEC sys.sp_configure N'max degree of parallelism', N'1'; -- Для 1С чаще всего 1
EXEC sys.sp_configure N'cost threshold for parallelism', N'50'; -- Порог стоимости
RECONFIGURE;
Увеличение порога стоимости (cost threshold for parallelism) с стандартных 5 до 50 или выше заставит сервер использовать параллелизм только для действительно тяжелых отчетов, не трогая простые запросы поиска.
Чтобы не заниматься ежедневным «передергиванием» настроек, проанализируем правильную стратегию обслуживания базы данных. Настроим автоматизацию, которая предотвратит деградацию планов:
UPDATE STATISTICS. Для критически важных таблиц (например, справочники физических лиц или контрагентов) можно использовать FULLSCAN.DBCC FREEPROCCACHE, которая бьет по всем пользователям, заставляя сервер заново компилировать тысячи запросов, научимся удалять конкретный «плохой» план. Для этого нужно найти plan_handle запроса в системных представлениях.Query Store. Она позволяет отслеживать регрессию планов и буквально одной кнопкой «принудительно закрепить» (Force Plan) старый быстрый план, если новый оказался тормозным.Auto Update Statistics и Auto Update Statistics Asynchronously. Асинхронное обновление позволит запросу не ждать, пока SQL пересчитает статистику, а выполнить поиск по старой (пусть и неидеальной), запустив процесс обновления в фоновом режиме.Подведем итог: если вы заметили, что смена параметров SQL помогает на короткое время — вы столкнулись с проблемой неоптимального кэширования планов. Не ищите «идеальную цифру» в настройках параллелизма, а займитесь качественным обслуживанием статистик и анализом конкретных медленных запросов. Только системный подход обеспечит мгновенный поиск в 1С каждое утро, а не только сразу после перезагрузки сервера.