Почему отчет с оптимизированным запросом работает медленнее исходного?

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

Часто в процессе разработки возникает парадоксальная ситуация: мы стараемся улучшить запрос, добавив в него ограничения, но производительность отчета падает. Давайте разберем, почему это происходит и как правильно оптимизировать работу с данными в 1С:Предприятие.

Почему виртуальные таблицы могут замедлять запрос

Когда мы обращаемся к виртуальным таблицам, таким как РегистрСведений.ЦеныНоменклатуры.СрезПоследних или РегистрНакопления.ТоварыНаСкладах.Остатки, платформа генерирует сложный SQL-запрос. Если мы передаем в параметры виртуальной таблицы сложные условия, например В ИЕРАРХИИ, оптимизатор СУБД может выбрать неэффективный план выполнения.

Более того, соединение виртуальной таблицы с другими данными напрямую в одном запросе заставляет сервер каждый раз вычислять эту таблицу заново. Если объем данных велик, это приводит к резкому росту нагрузки на дисковую подсистему и процессор.

Шаг 1: Используйте временные таблицы для разделения логики

Главный совет — не пытайтесь сделать всё в одном «большом» запросе. Разбейте его на несколько этапов. Первым делом соберите нужные данные в ВременнаяТаблица. Это позволит платформе четко понимать последовательность действий.

Рассмотрим, как это реализовать на практике:

  1. Выбираем номенклатуру, цены и файлы в одну временную таблицу.
  2. Индексируем временную таблицу по полю Номенклатура. Это критически важно для скорости последующего соединения.
  3. Соединяем результат с остатками, используя уже готовую, проиндексированную таблицу.

Шаг 2: Правильная работа с индексами

Если вы используете конструкцию ПОМЕСТИТЬ, обязательно используйте ИНДЕКСИРОВАТЬ ПО. Без явного индекса по полям, участвующим в соединении, SQL-сервер будет вынужден сканировать всю таблицу (Table Scan), что сводит на нет все усилия по оптимизации.


ВЫБРАТЬ
    Цены.Номенклатура,
    Цены.Цена
ПОМЕСТИТЬ ВТ_Цены
ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК Цены
ИНДЕКСИРОВАТЬ ПО
    Номенклатура
;

Шаг 3: Как избежать проблем с иерархией

Оператор В ИЕРАРХИИ в параметрах виртуальной таблицы — частая причина «тормозов». Вместо того чтобы заставлять систему вычислять иерархию внутри виртуальной таблицы, попробуйте сделать следующее:

  1. Сначала получите список всей нужной номенклатуры (включая иерархию) в отдельную временную таблицу.
  2. Используйте эту временную таблицу в условии ГДЕ Номенклатура В (ВЫБРАТЬ Номенклатура ИЗ ВТ_Номенклатура) вместо использования В ИЕРАРХИИ напрямую в параметрах.

Шаг 4: Анализ плана выполнения

Если запрос все еще работает медленно, не гадайте — проанализируйте план выполнения запроса. Это позволит увидеть, на каком этапе происходит Table Scan или тяжелое соединение Hash Match. В 1С для этого удобно использовать инструменты анализа производительности и технологический журнал.

Итоговые рекомендации по оптимизации

Подведем итог, как сделать отчет быстрым:

Следуя этим правилам, вы добьетесь предсказуемого и быстрого выполнения даже самых сложных отчетов, так как SQL-сервер сможет эффективно использовать индексы и строить оптимальные планы запросов.

← На главную