#std436¶
Многократное выполнение однотипных запросов¶
1.¶
Старайтесь получать однотипные данные одним запросом, а не серией запросов в цикле.
Это ускоряет работу с базой данных.
Для объединения используйте, например,
условие В, ОБЪЕДИНИТЬ ВСЕ
или пакет запросов.
Неправильно
ЧастныйЗапрос = Новый Запрос("
|ВЫБРАТЬ
| БанковскиеСчета.Ссылка КАК Счет
|ИЗ
| Справочник.БанковскиеСчета КАК БанковскиеСчета
|ГДЕ
| БанковскиеСчета.Банк = &Банк");
Для каждого Банк Из БанкиДляОбработки Цикл
ЧастныйЗапрос.УстановитьПараметр("Банк", Банк);
ВыборкаСчетов = ЧастныйЗапрос.Выполнить().Выбрать();
Пока ВыборкаСчетов.Следующий() Цикл
ОбработатьСчетаВБанке(ВыборкаСчетов.Счет);
КонецЦикла;
КонецЦикла;
Правильно
ОбщийЗапрос = Новый Запрос("
|ВЫБРАТЬ
| БанковскиеСчета.Ссылка КАК Счет
|ИЗ
| Справочник.БанковскиеСчета КАК БанковскиеСчета
|ГДЕ
| БанковскиеСчета.Банк В(&БанкиДляОбработки)");
ОбщийЗапрос.УстановитьПараметр("БанкиДляОбработки", БанкиДляОбработки);
ВыборкаСчетов = ОбщийЗапрос.Выполнить().Выбрать();
Пока ВыборкаСчетов.Следующий() Цикл
ОбработатьСчетаВБанке(ВыборкаСчетов.Счет);
КонецЦикла;
Если используется БСП, вызывайте интерфейсы
для работы со списками объектов:
ОбщегоНазначения.ЗначениеРеквизитаОбъектов()
вместо ЗначениеРеквизитаОбъекта() в цикле,
УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъектов()
вместо КонтактнаяИнформацияОбъекта() в цикле.
2.¶
Допускается разделение запроса на серию запросов в следующих случаях:
- заметно усложняется разработка запроса, который выбирает сразу все однотипные данные;
- ухудшается производительность запроса. Например, когда есть обращения к виртуальным таблицам, формируемым на определенную дату (остатки регистра накопления, срез последних периодического регистра сведений и т.п.);
- нужна порционная обработка большого объема данных: в обработчиках обновления, при групповом проведении или изменении данных, удалении помеченных объектов, контроле ведения учета, загрузке данных из файла или внешних источников, получении почты.
В этих случаях запросы в цикле:
- необходимы для порционности;
- либо незначительно замедляют обработку по сравнению с записью данных;
- либо неустранимы на текущих средствах платформы (например, чтение и запись наборов регистра в цикле по значениям измерения).
3.¶
Запросы к разным таблицам тоже рекомендуется объединять в один
с помощью ОБЪЕДИНИТЬ ВСЕ или пакета запросов.
При этом выигрыш по времени выполнения может быть незначительным.