Выбор ответа Junior Производительность спрашивают часто обновлено

Запрос в цикле

Вопрос

Что не так с кодом, если в документе 2000 строк?

Для Каждого Строка Из Товары Цикл
	Запрос = Новый Запрос("ВЫБРАТЬ Ц.Цена ИЗ РегистрСведений.Цены.СрезПоследних(&Дата, Номенклатура = &Товар) КАК Ц");
	Запрос.УстановитьПараметр("Дата", Дата);
	Запрос.УстановитьПараметр("Товар", Строка.Номенклатура);
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Строка.Цена = Выборка.Цена;
	КонецЕсли;
КонецЦикла;

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Запрос в цикле: 2000 обращений к СУБД вместо одного. Запрос в цикле классическая ошибка производительности: каждая итерация это отдельный вызов СУБД с накладными расходами.

Варианты ответа

  1. Запрос нельзя выполнять на сервере в модуле объекта
  2. Запрос в цикле: 2000 обращений к СУБД вместо одногоправильный ответ
  3. Нужно было использовать Выгрузить() вместо Выбрать()
  4. Ничего: это нормальная практика для табличных частей

Разбор

Запрос в цикле классическая ошибка производительности: каждая итерация это отдельный вызов СУБД с накладными расходами. Правильно передать все товары (табличную часть или временную таблицу) в один запрос и потом сопоставить результат. Выгрузить или Выбрать на число обращений не влияет, а сервер как раз место для запросов.

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

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

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