При разработке и вызове сложных аналитических отчетов на рабочей информационной базе разработчики часто сталкиваются с ситуацией, когда ресурсоемкий запрос замедляет работу всех остальных пользователей системы. Выполнение сложных выборок приводит к высокой загрузке процессора, забиванию оперативной памяти и задержкам на уровне СУБД. Проанализируем, почему возникает эта проблема и какими инструментами можно ограничить влияние тяжелых запросов на пользовательские сеансы.
Одной из главных причин замедления работы пользователей при выполнении тяжелого запроса является использование СУБД всех доступных ядер процессора для распараллеливания операции. По умолчанию параметр MAXDOP (Max Degree of Parallelism) в MS SQL Server может быть установлен в 0, что разрешает СУБД задействовать абсолютно все логические ядра для одного запроса.
Рассмотрим, как ограничить этот параметр по шагам:
0 на ограниченное число (например, 2 или значение, равное общему количеству ядер, разделенному на 4).Также рекомендуется скорректировать параметр Cost Threshold for Parallelism (порог стоимости для параллелизма). По умолчанию он равен 5. Повышение этого значения до 20–50 запретит серверу распараллеливать простые и средне-сложные запросы, сохраняя ресурсы для основных пользователей.
Выполнение огромной выборки нагружает не только SQL Server, но и рабочий процесс платформы 1С — rphost. Если на одном процессе rphost находятся сеансы оперативных пользователей и одновременно выполняется тяжелый аналитический отчет, этот процесс раздувается по памяти и вызывает подтормаживание у всех активных сессий.
Для предотвращения этой проблемы разберем варианты настройки кластера серверов 1С:
rphost. Запрос отчета займет лишь один из них, а остальные пользователи продолжат работу без задержек.Часто причиной повышенной нагрузки является неоптимальный код самого запроса 1С. Выясним, какие правила написания кода позволяют минимизировать нагрузку на системные ресурсы:
УДАЛИТЬ. Это освобождает ресурсы базы данных TempDB.ИНДЕКСИРОВАТЬ ПО.... Это избавляет MS SQL Server от сканирования всей таблицы (Table Scan).Посмотрим на пример правильного оформления пакета запросов с очисткой и индексацией временной таблицы:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Номенклатура КАК Номенклатура,
| СУММА(Продажи.Количество) КАК Количество
|ПОМЕСТИТЬ ВТ_Продажи
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
|СГРУППИРОВАТЬ ПО
| Продажи.Номенклатура
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура;
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Продажи.Номенклатура,
| ВТ_Продажи.Количество
|ИЗ
| ВТ_Продажи КАК ВТ_Продажи;
|////////////////////////////////////////////////////////////////////////////////
|УДАЛИТЬ ВТ_Продажи";
Проанализируем архитектурные подходы, которые позволяют полностью изолировать ресурсоемкие аналитические операции от оперативной работы пользователей:
ФоновыеЗадания. Это позволяет не блокировать пользовательский интерфейс и передать управление кластеру 1С для асинхронного расчета.ApplicationIntent=ReadOnly, что полностью снимает нагрузку с основной рабочей базы.