首页 > 解决方案 > SQL Server - 未使用的 LEFT JOIN 影响执行计划

问题描述

我有这样的查询

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

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

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

标签: sqlsql-serverleft-joinquery-performance

解决方案


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

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

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

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


推荐阅读