sql - 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 条件一起使用
解决方案
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
那是因为如果多行匹配连接条件,那么所有行都将被连接。
推荐阅读
- swift - 如何在 Swift 4 中跟踪 Firebase iOS 的离线交易
- ruby - 在更新操作中调用 ActiveRecord .reload 方法导致规范对象具有 nil id
- sqlite - 在 python 中使用 Flask/SQLAlchemy 限制 Chart.js 中的数据
- winforms - 在 VS2017 Winforms 应用程序中存在 IDE 缩放问题
- javascript - Angular 6 嵌套指令
- visual-studio - Visual Studio 无法打开 HTML 文件进行编辑,而是使用 Chrome 打开
- tensorflow - Tensorflow:带有注意力的seq2seq,维度不匹配
- c# - ASP.NET Core:在使用自定义 DbContext 的同时也使用 Identity 时出错
- node.js - Firebase 函数引用错误
- java - Jena(在 Ubuntu 上)为 ModelFactory 提供 NoClassDefFoundError