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

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

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

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

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

sticky bit 25.12.2020 15:31
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

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

A. Can D. 25.12.2020 15:46

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

Thom A 25.12.2020 16:31

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

Другие вопросы по теме