Выбор ответа Junior Производительность спрашивают часто обновлено
Запрос в цикле
Вопрос
Что не так с кодом, если в документе 2000 строк?
Для Каждого Строка Из Товары Цикл
Запрос = Новый Запрос("ВЫБРАТЬ Ц.Цена ИЗ РегистрСведений.Цены.СрезПоследних(&Дата, Номенклатура = &Товар) КАК Ц");
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("Товар", Строка.Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Строка.Цена = Выборка.Цена;
КонецЕсли;
КонецЦикла;
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Запрос в цикле: 2000 обращений к СУБД вместо одного. Запрос в цикле классическая ошибка производительности: каждая итерация это отдельный вызов СУБД с накладными расходами.
Варианты ответа
- Запрос нельзя выполнять на сервере в модуле объекта
- Запрос в цикле: 2000 обращений к СУБД вместо одногоправильный ответ
- Нужно было использовать Выгрузить() вместо Выбрать()
- Ничего: это нормальная практика для табличных частей
Разбор
Запрос в цикле классическая ошибка производительности: каждая итерация это отдельный вызов СУБД с накладными расходами. Правильно передать все товары (табличную часть или временную таблицу) в один запрос и потом сопоставить результат. Выгрузить или Выбрать на число обращений не влияет, а сервер как раз место для запросов.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.