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 子查询会导致性能损失吗?的主要内容,如果未能解决你的问题,请参考以下文章

sql语句中where条件的嵌套子查询性能

sql server with as 能提高性能吗

SQL Server 2008 - 性能慢查询

SQL Server:IN 子查询的选择 vs 值性能

Docker上跑数据库会导致的性能损失大吗

SQL Server - 条件语句的查询执行计划