#std657¶
Обращения к виртуальным таблицам¶
1.¶
Передавайте в параметры виртуальной таблицы все условия, относящиеся к ней. Не переносите такие условия в секцию ГДЕ.
Так запрос будет работать быстрее: СУБД сможет выбрать лучший план выполнения и не будет обрабатывать лишние записи.
2.1.¶
В параметрах виртуальной таблицы используйте простые условия вида Измерение = Значение. Не используйте подзапросы и соединения.
Примечание
Под соединениями понимаются:
- явные соединения в подзапросах;
- неявные соединения при обращении к полям через точку;
- соединения, добавляемые из ограничений доступа к данным (RLS).
2.2.¶
Если подзапросы нужны, соблюдайте условия:
- в подзапросе только одна таблица, без соединений с другими таблицами;
- если таблица подзапроса - табличная часть, не обращайтесь к реквизитам шапки документа;
- если таблица подзапроса - документ с табличными частями, не обращайтесь к табличным частям;
- если таблица подзапроса - временная, не используйте раздел
ГДЕ; - если таблица подзапроса - постоянная, раздел
ГДЕдопустим только если условие выполняется в 80% случаев и более; - если таблица подзапроса - постоянная, в RLS не должно быть подзапросов и соединений (допустимы только простые условия).
Неправильно
...
ИЗ
РегистрНакопления.ТоварыКОтгрузке.Остатки(
&ДатаОтгрузки,
&ОтображениеРаспоряжений
И ДокументОтгрузки.Склад = &Склад // (1)
ИЛИ ДокументОтгрузки В
(ВЫБРАТЬ // (2)
Распоряжения.Распоряжение КАК ДокументОтгрузки
ИЗ
Документ.ЗаданиеНаПеревозку.Распоряжения КАК Распоряжения // (3)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаданиеНаПеревозку.СкладыПогрузки КАК СкладыПогрузки
ПО
Распоряжения.Ссылка = СкладыПогрузки.Ссылка
И СкладыПогрузки.Склад = &Склад
И Распоряжения.Ссылка.Проведен // (4)
И Распоряжения.Ссылка.Статус В (...)))
- Неявное соединение через точку
- Подзапрос с соединением
- Доступ к этому документу ограничен по сложному RLS, который неявно добавляет еще пару соединений
- Здесь и ниже обращения к реквизитам шапки
Правильно
...
ИЗ
РегистрНакопления.ТоварыКОтгрузке.Остатки(
&ДатаОтгрузки,
Склад = &Склад // (1)
ИЛИ ДокументОтгрузки В
(ВЫБРАТЬ
ЗаданияНаПеревозку.Распоряжение
ИЗ
ВременнаяТаблицаЗаданийНаПеревозку КАК ЗаданияНаПеревозку)) // (2)
- Теперь это реквизит регистра
- Выборка из временной таблицы без условий
2.3.¶
Если нужно несколько условий с подзапросами, выберите одно, которое удовлетворяет требованиям выше и отфильтровывает максимум записей. Остальные условия накладывайте на внешний запрос.
В ряде случаев вместо нескольких условий можно использовать временную таблицу.
Правильно
См. также¶
- #std654: Разыменование ссылочных полей составного типа в языке запросов
- #std733: Эффективное обращение к виртуальной таблице "Остатки"
- Использование параметра Условие при обращении к виртуальной таблице (статья на ИТС)