我最近注意到,如果select
或where
子句中未使用任何列,则SQL Server 2016似乎忽略了左连接。在实际执行计划中也找不到。
如果有人添加了额外的连接但仍未影响性能,则此功能非常有用。
如果我在左边连接表的select子句中添加了列,但是只有1秒,那么我的查询花了9秒。
任何人都可以检查并建议,这是真的吗?
使用实际执行计划查询。您可以看到执行计划中没有任何左表连接表。
答案 0 :(得分:4)
我不是100%确定问题是什么,但SQL优化器可以忽略left join
。考虑这种类型的查询:
select a.*
from a left join
b
on a.b_id = b.id;
如果b.id
被声明为unique
(或等效地为primary key
),则上述查询返回的结果集完全相同:
select a.*
from a;
我不是本身意识到SQL Server在2016年开始进行此优化。但优化是完全有效的,并且(我相信)其他优化器确实实现了它。
请记住,SQL是声明性语言,而不是过程语言。 SQL查询描述结果集,而不是如何生成结果集。
答案 1 :(得分:-2)