Вызывают ли подзапросы SQL Server потерю производительности?

#sql #sql-server #subquery #left-join #query-optimization

#sql #sql-server #подзапрос #левое соединение #оптимизация запросов

Вопрос:

Я подключил 2 таблицы с помощью inner join, но в 2 таблицах есть столбцы с одинаковыми именами. Я сделал свой запрос подзапросом, чтобы использовать только требуемый столбец. Приведет ли это к потере скорости, если я использую подзапрос?

Примечание: я использовал translate

 Select
    *
From 
    (Select
         t1.Id, ...
     From
         Table1 as t1
     left join
         Table2 as t2 on t1.Id = t2.ParentId
     --Where
         --Id = 123 This Line. Error : Ambiguous column name 'Id'.
    ) as Foo
where
    Id = 123
 

Комментарии:

1. Хм, вы, очевидно, знаете, как использовать псевдонимы и определять идентификаторы столбцов, так почему бы вам просто не сделать это в WHERE предложении, чтобы устранить двусмысленность? На вопрос: проверьте план. Но я думаю, что очень вероятно, что оптимизатор опускает WHERE предложение, и потери производительности нет.

Ответ №1:

В подзапросе нет необходимости. Вы устраняете неоднозначность, добавляя к столбцу префикс таблицы, к которой он принадлежит:

 select t1.Id, ...
from Table1 as t1
left join Table2 as t2 on t2.ParentId = t1.Id
where t1.Id = 123  -- presumably
 

Что касается вашего исходного запроса: влияет ли использование подзапроса здесь на производительность? Я ожидал бы, что база данных, такая как SQL Server, предусматривает очевидную оптимизацию передачи предиката в подзапрос. Но вам нужно будет сравнить планы выполнения, чтобы убедиться.

Обратите внимание, что если вам действительно нужен подзапрос, обычно лучше выполнить предварительную фильтрацию:

 select t1.Id, ...
from (select * from Table1 where Id = 123) as t1
left join Table2 as t2 on t2.ParentId = t1.Id
 

Комментарии:

1. Я не могу указать псевдоним таблицы для динамического условия

2. В вашем вопросе @A.CanD. нет динамического SQL , и даже если бы он был, вы все равно можете использовать псевдонимы объектов в динамических операторах.

Ответ №2:

В вашем запросе последняя строка, содержащая условие where, указывает псевдоним для идентификатора, что позволит избежать ошибки неоднозначности.