#std654¶
Разыменование ссылочных полей составного типа в языке запросов¶
1.1.¶
В языке запросов можно обращаться не только к полям таблиц из раздела ИЗ, но и к полям объектов, на которые ссылаются ссылочные поля.
Обращение к полям через точку (ПолеСсылка.Реквизит) добавляет неявные соединения с дополнительными таблицами.
Это относится и к ограничениям доступа на уровне записей (RLS): в запрос могут добавляться таблицы, участвующие в проверках прав к неявно подключенным объектам.
Пример
1.2.¶
Чем больше неявных соединений, тем сложнее и медленнее запрос.
Особенно это критично для ссылочных полей #std728: составного типа: платформа может соединять запрос со всеми таблицами, которые входят в состав типа, а также с таблицами из RLS этих объектов.
Неправильно
Подобное получение данных через точку от ссылочных полей составного типа крайне нежелательно. Каждое исключение из этого правила нужно отдельно анализировать.
2.1.¶
Избегайте избыточных составных типов ссылочных полей.
Указывайте только те типы ссылок, которые действительно нужны бизнес-логике. Без необходимости не применяйте варианты вида «любая ссылка».
Сначала анализируйте прикладную логику, затем оставляйте только реально используемые типы.
2.2.¶
Чтобы не строить запросы с большим числом соединений, жертвуйте компактностью хранения данных ради производительности и переносите нужные поля в исходную таблицу запроса.
Например, можно добавить в регистр реквизит ДатаРегистратора, заполнять его при проведении и использовать в запросах напрямую.
Правильно
Это приведет к дублированию данных и небольшому росту объема хранения, но может существенно повысить производительность и стабильность запроса.
2.3.¶
При необходимости жертвуйте компактностью и универсальностью кода ради производительности.
- Для конкретного запроса обычно не нужны все возможные типы составной ссылки. Ограничивайте их через
ВЫРАЗИТЬ. - Если один и тот же запрос используется в разных сценариях, формируйте его текст динамически и подставляйте в
ВЫРАЗИТЬнужный тип в зависимости от контекста.
Это увеличит объем кода и может снизить универсальность, но обычно заметно повышает производительность и стабильность.
Неправильно
В этом примере поле Регистратор может быть ссылкой на один из десятков типов документов.
В таком случае SQL-текст развернется в большое число соединений (в исходном стандарте показан пример с 56 соединениями), что резко ухудшает производительность.
Правильно
ВЫБРАТЬ
ВЫБОР
КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Номер
КОГДА Продажи.Регистратор ССЫЛКА Документ.ЗаказПокупателя
ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказПокупателя).Номер
КОНЕЦ КАК Номер,
ВЫБОР
КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Дата
КОГДА Продажи.Регистратор ССЫЛКА Документ.ЗаказПокупателя
ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказПокупателя).Дата
КОНЕЦ КАК Дата,
Продажи.Контрагент КАК Контрагент,
Продажи.Количество КАК Количество,
Продажи.Стоимость КАК Стоимость
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ
Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
ИЛИ Продажи.Регистратор ССЫЛКА Документ.ЗаказПокупателя
В таком варианте SQL формируется с небольшим числом соединений по реально используемым типам, поэтому запрос работает быстрее и стабильнее.
См. также¶
- #std477: Самодостаточность регистров
- #std437: Оформление текстов запросов
- #std657: Обращения к виртуальным таблицам
- #std658: Эффективные условия запросов
- #std728: Ограничения на использование реквизитов составного типа