SQL Server 子查询会导致性能损失吗?
Posted
技术标签:
【中文标题】SQL Server 子查询会导致性能损失吗?【英文标题】:Do SQL Server subqueries cause performance loss? 【发布时间】:2020-12-25 14:28:22 【问题描述】:我使用内连接连接了 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
子句向下推,并且没有性能损失。
【参考方案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
【讨论】:
我无法为动态条件指定表别名 您的问题@A.CanD 中没有动态 SQL。 ,即使有,你仍然可以在动态语句中给对象起别名。【参考方案2】:在您的查询中,包含 where 条件 的最后一行为 ID 提供 别名,它将避免歧义错误。
【讨论】:
以上是关于SQL Server 子查询会导致性能损失吗?的主要内容,如果未能解决你的问题,请参考以下文章