При работе с адресным классификатором (ФИАС) в среде 1С:Предприятие 8.3 системные администраторы часто сталкиваются с необъяснимым падением производительности. Характерный симптом: при вводе первых букв улицы поиск замирает на 12–15 секунд. Примечательно, что проблема проявляется избирательно — например, только если в базе загружен регион 02 (Башкортостан), и именно на версии SQL Server 2014. Рассмотрим подробнее, почему это происходит и как вернуть системе быстродействие.
Проанализируем ситуацию, описанную пользователями. Наблюдается парадокс: если поиск выдает много результатов (например, 50 улиц), он отрабатывает за доли секунды. Но если под фильтр попадает всего 1–2 улицы, система «подвисает». Выясним причину этой зависимости. Оказывается, при загрузке тяжелых регионов, таких как Башкортостан, объем записей в регистре сведений АдресныеОбъекты (или аналогичных таблицах БСП) достигает критической массы, которая вводит в заблуждение оптимизатор запросов SQL Server.
Проблема кроется в механизме Cardinality Estimation (CE) — движке оценки кардинальности, который в версии SQL 2014 был полностью переписан. На определенных наборах данных он начинает ошибаться в миллиарды раз, полагая, что в результате соединения таблиц получится колоссальное количество строк, хотя на деле возвращается одна. Это приводит к выбору крайне неэффективного плана выполнения.
Посмотрим на типичный запрос, который генерирует 1С (подсистема «Адресный классификатор» из БСП) при автоподборе. Программа запрашивает первые 20–300 записей, используя конструкцию ВЫБРАТЬ ПЕРВЫЕ (в SQL это SELECT TOP). Для оптимизатора SQL Server наличие TOP является сигналом Row Goal. Система пытается найти план, который максимально быстро вернет именно первые N строк.
В случае с регионом 02 и SQL 2014 происходит следующее:
TOP 20 и решает, что параллельное сканирование индекса (Parallel Scan) — лучший способ быстро «насшибать» нужные строки.Est Rows 1 536 920 000 000 при факте в 1 строку.CXPACKET), данные начинают сбрасываться во временную базу TempDB.В итоге вместо мгновенного поиска по индексу мы получаем 15-секундное «молочение» дисков и процессора.
Рассмотрим фрагмент запроса, который вызывает проблемы:
SELECT TOP 20
T2._Fld18485,
T2._Fld18486,
...
FROM #tt18 T1 WITH(NOLOCK)
LEFT OUTER JOIN dbo._InfoRg18472 T2 ON ...
LEFT OUTER JOIN dbo._InfoRg18472 T3 ON ...
ORDER BY (T1._Q_000_F_000), (T10._Fld18485), (T9._Fld18485)
Самым эффективным и проверенным методом решения данной проблемы является ограничение параллелизма на уровне сервера SQL. Это заставляет оптимизатор строить более предсказуемые последовательные планы выполнения, которые для логики 1С почти всегда работают стабильнее.
Пошаговая инструкция:
Max Degree of Parallelism (Максимальная степень параллелизма).1.Почему это помогает: Установка MAXDOP = 1 исключает саму возможность появления параллельных планов запросов, в которых SQL Server 2014 допускает критические ошибки при работе с ФИАС. Как показывает практика, скорость поиска после этой настройки возрастает с 12 секунд до 0.02 секунды.
Если ограничение параллелизма по каким-то причинам нежелательно для всей системы, попробуем помочь оптимизатору увидеть реальную картину распределения данных. Обычное регламентное обновление статистики часто использует сэмплирование (проверку лишь части строк), чего недостаточно для «плотных» данных ФИАС.
Выполните в контексте вашей базы данных следующий SQL-скрипт (заменив имя таблицы на актуальное для вашей конфигурации):
-- Имя таблицы можно узнать через консоль запросов или в свойствах регистра
UPDATE STATISTICS _InfoRg18472 WITH FULLSCAN, COLUMNS;
GO
Это обеспечит максимально точную гистограмму, что может заставить SQL Server отказаться от неэффективных соединений типа Merge Join в пользу Nested Loops.
Разберем еще один вариант. Если вы не хотите переходить на SQL Server 2017/2019 (где адаптивная обработка запросов исправляет эти ошибки автоматически), можно заставить конкретную базу данных использовать старый, более надежный движок оценки от SQL 2012.
Для SQL Server 2014 это можно сделать через флаг трассировки 9481. Его можно включить глобально или добавить в параметры запуска сервера. Однако более мягким способом является установка уровня совместимости или использование Database Scoped Configuration (доступно в более новых версиях, в 2014 только через флаги).
Рекомендация: Если есть возможность, рассмотрите переход на SQL Server 2017 или выше. Как показывают тесты, даже с настройками по умолчанию (MAXDOP = 0) современные версии SQL справляются с запросами ФИАС корректно благодаря встроенным механизмам автоматической коррекции планов.
Проанализируем сопутствующие факторы. Хотя Rebuild Index и Update Statistics в обычном режиме не решают проблему кардинальности, они критически важны для общего здоровья базы. 1С официально рекомендует для высоконагруженных баз устанавливать Cost Threshold for Parallelism (Порог стоимости для параллелизма) в значение от 50 и выше, чтобы SQL не пытался распараллеливать мелкие и простые запросы.
Резюме: Если вы столкнулись с тормозами при вводе адреса в 1С на SQL 2014, первым делом проверьте значение MAXDOP. Установка его в 1 — это «золотой стандарт» настройки для 1С, который решает 90% проблем с неадекватным временем выполнения запросов к адресному классификатору.