Код-ревью Senior Производительность обновлено

Ревью тяжёлого запроса

Вопрос

Запрос для отчёта по задолженности стал выполняться минуты. Найдите причины.

ВЫБРАТЬ
	Д.Ссылка КАК Документ,
	Д.Контрагент.ОсновнойДоговор.Валюта.Наименование КАК Валюта,
	Вз.СуммаОстаток КАК Долг
ИЗ
	Документ.Реализация КАК Д
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Взаиморасчеты.Остатки() КАК Вз
		ПО Д.Ссылка = Вз.Сделка
ГДЕ
	Вз.Контрагент = &Контрагент
	И ГОД(Д.Дата) = 2026

Коротко

Правильнее: сначала остатки с отбором по контрагенту в параметрах виртуальной таблицы во временную таблицу с индексом по сделке, затем соединение с документами за диапазон дат, без длинных цепочек точек.

Что должен найти ревьюер

  1. Производительностьстрока 3
    Цепочка точек: три неявных соединения ради одного поля.
  2. Производительностьстрока 7
    Виртуальная таблица без условия в параметрах считает остатки по всем контрагентам; соединение с ней опасно для плана.
  3. Производительностьстрока 10
    Отбор по контрагенту в ГДЕ, а не в параметрах Остатки(, Контрагент = &Контрагент).
  4. Ошибкастрока 10
    Условие на поле правой таблицы в ГДЕ превращает ЛЕВОЕ соединение во внутреннее: документы без остатка пропадут, если они нужны.
  5. Производительностьстрока 11
    Функция над полем ГОД(Д.Дата) мешает использовать индекс по дате; нужен диапазон Д.Дата МЕЖДУ &Начало И &Конец.

Разбор

Правильнее: сначала остатки с отбором по контрагенту в параметрах виртуальной таблицы во временную таблицу с индексом по сделке, затем соединение с документами за диапазон дат, без длинных цепочек точек.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме