Виртуальные таблицы в запросе без отборов
Использование виртуальных таблиц (срезы РС, обороты/остатки РН и т.д.) в запросе без отбора чаще всего является ошибочным и приводит к неэффективной выборке данных.
При использовании виртуальных таблиц в запросах, следует передавать в параметры таблиц все условия, относящиеся к данной виртуальной таблице.
Не рекомендуется фильтровать виртуальные таблицы при помощи условий в секции ГДЕ и т.п.
Такой запрос будет возвращать правильный (с точки зрения функциональности) результат, но СУБД будет намного сложнее выбрать оптимальный план для его выполнения. В некоторых случаях это может привести к ошибкам оптимизатора СУБД и значительному замедлению работы запроса.
Например, следующий запрос использует секцию ГДЕ запроса для выборки из виртуальной таблицы.
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки()
|ГДЕ
| Склад = &Склад";
Возможно, что в результате выполнения этого запроса сначала будут выбраны все записи виртуальной таблицы, а затем из них будет отобрана часть, соответствующая заданному условию. Было бы оптимальным вариантом ограничивать количество выбираемых записей на самом раннем этапе обработки запроса.
Для этого следует передать условия в параметры виртуальной таблицы.
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад)";
Очень важная и полезная информацию об обращении к виртуальным таблицам содержится в стандартах ИТС от 1С: - Фильтрация виртуальных таблиц без использования параметров - Типичные причины неоптимальной работы запросов и методы оптимизации - стандарты 1С - Эффективное обращение к виртуальной таблице «Остатки» - Типичные причины неоптимальной работы запросов и методы оптимизации - стандарты 1С
См. также
- Обращения к виртуальным таблицам - стандарты 1С
- Использование параметра Условие при обращении к виртуальной таблице - стандарты 1С
Экранирование кода
// sonar:VirtualTablesWithoutInnerFilter:off
// sonar:VirtualTablesWithoutInnerFilter:on