После обновления типовых конфигураций (таких как Управление торговлей 11, Комплексная автоматизация 2 или 1С:ERP 2) на определенные релизы пользователи могут столкнуться с резким замедлением работы системы. Типичный симптом — открытие списков документов или изменение порядка сортировки (например, переключение сортировки с даты на номер) начинает выполняться десятки секунд вместо привычных одной-двух. При этом регламентные процедуры СУБД (дефрагментация индексов, очистка процедурного кэша, обновление статистики) не дают видимого эффекта. Разберем детально, почему это происходит и как восстановить быстродействие базы данных.
Проанализируем техническую первопричину проблемы. Изначально в конфигурациях была зарегистрирована ошибка для СУБД PostgreSQL: при выполнении конструкции EXISTS в общей части запросов RLS оптимизатор PostgreSQL не задействовал индексы, что приводило к катастрофическому падению скорости работы в 50–200 раз. Разработчики типовых решений внесли изменения в стандартные шаблоны ограничения доступа к данным, адаптировав их под особенности PostgreSQL.
Однако изменение порядка таблиц во внутреннем соединении (INNER JOIN) внутри шаблонов прав негативно повлияло на оптимизатор запросов MS SQL Server. Хотя операция внутреннего соединения математически коммутативна, оптимизатор MS SQL Server строит план выполнения на основе внутренних эвристик и расчета стоимости. В сложных RLS-запросах со вложенными подзапросами оптимизатор преждевременно прерывал перебор вариантов и выбирал неоптимальный алгоритм соединения — вместо точечного поиска по индексу (Index Seek) запускалось сканирование кластерных индексов или ресурсоемкие циклические просмотры (Nested Loops).
Особенно ярко это проявляется в динамических списках. Динамический список запрашивает данные порциями. Когда пользователь меняет сортировку (например, по номеру), СУБД при некорректном плане перестает применять раннюю отсечку строк, полностью сканирует физическую таблицу и вычисляет тяжелое RLS-выражение для каждой записи еще до того, как вернуть первую страницу пользователю.
Данная проблема была официально зафиксирована фирмой «1С» под номером 00-00118228.
Если обновление конфигурации на исправленный релиз в данный момент невозможно, применим локальное исправление шаблонов RLS. Для этого снимем с поддержки правила или шаблоны прав в конфигураторе и изменим порядок соединения таблиц.
Рассмотрим, какие именно строки необходимо найти во всех стандартных шаблонах ограничения доступа к данным:
Справочник.ИдентификаторыОбъектовМетаданных КАК СвойстваТекущейТаблицы
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа
Заменим этот фрагмент на исходный порядок таблиц, при котором оптимизатор MS SQL Server строит корректный план выполнения:
РегистрСведений.ТаблицыГруппДоступа КАК ТаблицыГруппДоступа
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ИдентификаторыОбъектовМетаданных КАК СвойстваТекущейТаблицы
После внесения изменений во все шаблоны ролей необходимо обновить конфигурацию базы данных. Это сразу возвращает прежнюю скорость обработки динамических списков на MS SQL Server.
Если ручное редактирование текста шаблонов во всех ролях слишком трудоемко, разберем альтернативные шаги восстановления производительности:
Если корректировка шаблонов по каким-либо причинам откладывается, рассмотрим серверные настройки, помогающие оптимизатору MS SQL справляться со сложными RLS-конструкциями:
ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = ON;
Альтернативно можно использовать флаг трассировки 9481 на уровне инстанса СУБД.Справочник.ИдентификаторыОбъектовМетаданных и РегистрСведений.ТаблицыГруппДоступа настроим регламентное обновление статистики с параметром FULLSCAN.ИЛИ (OR), что практически полностью блокирует использование индексов на стороне СУБД.1С:Предприятие 8.3 и подсистемы БСП рекомендуется использовать механизм ограничения доступа с предварительным расчетом прав (производительный режим). В этом режиме права рассчитываются при записи объектов в специальные таблицы ключей доступа, а при чтении списков проверка сводится к тривиальному соединению без вычисления тяжелых шаблонов на лету.