考虑这个由N
自连接组成的查询:
select
t1.*
from [Table] as t1
join [Table] as t2 on
t1.Id = t2.Id
-- ...
join [Table] as tN on
t1.Id = tN.Id
Run Code Online (Sandbox Code Playgroud)
它生成一个执行计划,其中包含 N 次聚集索引扫描和 N-1 次合并连接。
老实说,我看不出有任何理由不优化所有连接并仅执行一次聚集索引扫描,即将原始查询优化为:
select
t1.*
from [Table] as t1
Run Code Online (Sandbox Code Playgroud)
测试:
查询没有意义;它刚刚出现在我的脑海中,我现在对它很好奇。
这是表创建和 3 个查询的小提琴:使用inner join
's、使用left join
's 和混合。您也可以在那里查看执行计划。
似乎left join
在结果执行计划中消除了inner join
s而s 则没有。不过还是不明白为什么 …