Наружное применение против встроенного запроса - PullRequest
0 голосов
/ 12 апреля 2019

Должен ли быть выбор между этими двумя запросами, или можно использовать любой из них?

Встроенный запрос

select 
       *,
       (select count(*) from t2 where Id=t1.RefId) as Count
from t1

Внешнее применение

select 
       *,
       c.Count
from t1
outer apply (select count(*) as Count from t2 where Id=t1.RefId) c

1 Ответ

1 голос
/ 12 апреля 2019

Как говорит Гордон в своем комментарии выше, Outer Apply, используемый в вашем коде, должен иметь тот же или аналогичный план выполнения, что и внешний запрос на применение. Однако, если у вас есть несколько скалярных подзапросов, подобных этому:

select 
       *,
       (select Min(Val) from t2 where Id=t1.RefId) as Minimum
       (select Max(Val) from t2 where Id=t1.RefId) as Maximum
       (select count(*) from t2 where Id=t1.RefId) as Count
from t1

, где единственная разница между подзапросами - возвращаемое значение, тогда внешний запрос на применение может быть более эффективным:

select 
       *,
       c.Minimum,
       c.Maximum,
       c.Count
from t1
outer apply (select Min(Val) as Minimum,
                    Max(Val) as Maximum,
                    count(*) as Count,
               from t2 where Id=t1.RefId) c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...