Объединение или вложенный выбор

#sql-server

#sql-сервер

Вопрос:

Мне нужно получить некоторые данные из таблицы1 и только один столбец из таблицы2. Какой запрос лучше? Есть ли какая-либо разница в производительности и т. Д.?

 select t1.Col1, t1.Col2, 
    (select t2.Name from table2 t2 where t1.Code = t2.Code) as 'Name'
from table1 t1
  

или

 select t1.Col1, t1.Col2, t2.Name
from table1 t1
    left join table2 t2 on t1.Code = t2.Code 
  

Ответ №1:

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

Лично я предпочитаю синтаксис объединения
, что делать, если у вас много строк в table2 для каждого кода в таблицах. И производительность, как упоминалось

Ответ №2:

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

Сказав это, SQL Server отлично оптимизирует этот материал, особенно для условий равенства, подобных вашему выше. Попробуйте посмотреть на оба, используя предполагаемый план выполнения, и вы увидите, что, вероятно, им обоим предоставлена аналогичная оптимизация.