左连接忽略

时间:2018-04-05 10:47:30

标签: sql sql-server outer-join

我最近注意到,如果selectwhere子句中未使用任何列,则SQL Server 2016似乎忽略了左连接。在实际执行计划中也找不到。

如果有人添加了额外的连接但仍未影响性能,则此功能非常有用。

如果我在左边连接表的select子句中添加了列,但是只有1秒,那么我的查询花了9秒。

任何人都可以检查并建议,这是真的吗?

使用实际执行计划查询。您可以看到执行计划中没有任何左表连接表。

enter image description here

2 个答案:

答案 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)

如果你有一个左连接并且你的匹配条件不会从连接表中返回任何数据,那么当select语句不包含右表中的列时,它将返回数据作为内连接返回。不仅在ms server 2016中,而且在大多数DB中。 如果连接表中有大量可用数据,则左连接会降低查询的性能。