SQL 服务器 - 未使用的 LEFT JOIN 影响执行计划

SQL Server - unused LEFT JOIN impacts execution plan

我有这样的查询

SELECT TableA.Id FROM TableA
LEFT JOIN TableB ON TableA.Id = TableB.TableAId

在这种情况下,来自 table B 的列实际上未被使用并且不会影响结果,因为它不是 INNER JOIN。但是执行计划清楚地表明它正在被使用并且它会影响性能。 SQL服务器不应该优化它以消除未使用的操作吗?有没有办法设置一些执行提示来执行此操作或重写查询以仅在 SELECT 或 WHERE 子句中实际存在时才使用此连接?

不幸的是,我不能只从查询中删除未使用的连接。在现实生活中,它是一个更复杂的视图,连接了许多 table,并且它总是与不同的 SELECT 列表或 WHERE 条件

一起使用

LEFT JOIN 可以改变结果,即使它们的列不在结果集中也是如此。

看看这两个查询如何 return 不同的结果:

create table TableA (TableAId int)
create table TableB (TableBId int, TableAId int)

insert into TableA (TableAId) values (100), (200), (300)
insert into TableB (TableBId, TableAId) values (1, 100), (1, 200), (2, 100), (3, 300)

select TableA.TableAId 
from TableA

select TableA.TableAId 
from TableA
     left join TableB on TableB.TableAId = TableA.TableAId

这是因为如果多行符合连接条件,那么所有行都将被连接。