Перейти к содержанию

Виртуальные таблицы в запросе без отборов

Использование виртуальных таблиц (срезы РС, обороты/остатки РН и т.д.) в запросе без отбора чаще всего является ошибочным и приводит к неэффективной выборке данных.

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

Не рекомендуется фильтровать виртуальные таблицы при помощи условий в секции ГДЕ и т.п.

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

Например, следующий запрос использует секцию ГДЕ запроса для выборки из виртуальной таблицы.

Запрос.Текст = "ВЫБРАТЬ
| Номенклатура
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки()
|ГДЕ
| Склад = &Склад";

Возможно, что в результате выполнения этого запроса сначала будут выбраны все записи виртуальной таблицы, а затем из них будет отобрана часть, соответствующая заданному условию. Было бы оптимальным вариантом ограничивать количество выбираемых записей на самом раннем этапе обработки запроса.

Для этого следует передать условия в параметры виртуальной таблицы.

Запрос.Текст = "ВЫБРАТЬ
| Номенклатура
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад)";

Очень важная и полезная информацию об обращении к виртуальным таблицам содержится в стандартах ИТС от 1С: - Фильтрация виртуальных таблиц без использования параметров - Типичные причины неоптимальной работы запросов и методы оптимизации - стандарты 1С - Эффективное обращение к виртуальной таблице «Остатки» - Типичные причины неоптимальной работы запросов и методы оптимизации - стандарты 1С

См. также

Экранирование кода

// sonar:VirtualTablesWithoutInnerFilter:off
// sonar:VirtualTablesWithoutInnerFilter:on