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

Излишнее разыменование в условии соединения

Использование более N точек в запросе может привести к понижению производительности.

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

Например, в запросе

ВЫБРАТЬ
ТоварныеЗапасы.Товар КАК Товар,
ТоварныеЗапасы.Количество КАК Количество,
ТоварныеЗапасы.Товар.Артикул КАК Артикул
ИЗ
РегистрНакопления.ТоварныеЗапасы КАК ТоварныеЗапасы
...

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

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

Например, в приведенном ниже запросе получение даты регистратора приведет к неявному соединению с таблицами всех документов - регистраторов регистра ТоварныеЗапасы

ВЫБРАТЬ
...
ТоварныеЗапасы.Регистратор.Дата,
...
ИЗ
РегистрНакопления.ТоварныеЗапасы КАК ТоварныеЗапасы
...

Подобное получение данных "через точку" от ссылочных полей составного типа крайне нежелательно. Каждое исключение из этого правила должно тщательно анализироваться.

  • Как правило, для выполнения конкретного запроса в данных условиях не нужны все возможные типы данной ссылки. В этом случае, следует ограничить количество возможных типов при помощи функции ВЫРАЗИТЬ.
  • Если данный запрос является универсальным и используется в нескольких разных ситуациях (где типы ссылки могут быть разными), то можно формировать запрос динамически, подставляя в функцию ВЫРАЗИТЬ тот тип, который необходим при данных условиях. Это увеличит объем исходного кода и, возможно, сделает его менее универсальным, но может существенно повысить производительность и стабильность работы запроса.

В условии соединения неявные разыменования могут привести к непониманию и впоследствии ошибкам.

См. также

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

// sonar:ExcessiveDereferenceInJoins:off
// sonar:ExcessiveDereferenceInJoins:on