外部连接的位置vs ON

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了外部连接的位置vs ON相关的知识,希望对你有一定的参考价值。

我想知道当决定在条件子句中已有条件时是否要重复我们的条件时,如何提高SQL性能。

我的朋友声称这取决于数据库引擎,但我不太确定。

[无论使用哪种数据库引擎,通常都应在联接之前首先执行Where子句中的条件,但是我认为这意味着内部联接,而不是外部联接。因为某些条件只能在外部联接之后执行。

例如:

Select a.*, b.* 
From A a
Left outer join B on a.id = b.id 
Where b.id is NULL;

外部连接之前无法在何处执行条件。

因此,我假设整个ON子句必须首先在where子句之前执行,并且似乎ON子句将在外部联接之前控制表B(如果使用正确的外部联接,则控制表A)的大小。在我看来,这与数据库引擎无关。

这引起了我的问题:当我们使用外部联接时,是否应该始终在ON子句中复制我们的条件?

例如(我使用一个表对其自身的较短版本进行外部联接)

temp_series_installment&series_id> 18940000temp_series_installment

select sql_no_cache s.*, t.* from temp_series_installment s
left outer join temp_series_installment t on s.series_id = t.series_id and t.series_id > 18940000 and t.incomplete = 1
where t.incomplete = 1;

VS

select sql_no_cache s.*, t.* from temp_series_installment s
left outer join temp_series_installment t on s.series_id = t.series_id and t.series_id > 18940000
where t.incomplete = 1;

我试图查看mysql中是否有性能差异:

enter image description here

但是这出乎我的意料,为什么第二个更快?我认为通过外部连接较小的表,查询会更快。

我的想法来自:https://www.ibm.com/support/knowledgecenter/en/SSZLC2_8.0.0/com.ibm.commerce.developer.doc/refs/rsdperformanceworkspaces.htm

部分:

尽可能将谓词推入OUTER JOIN子句尽可能为不同的表复制恒定条件

答案

[无论使用哪种数据库引擎,通常都应在联接之前首先执行Where子句中的条件,但是我认为这意味着内部联接,而不是外部联接。因为某些条件只能在外部联接之后执行。

这根本不是真的。 SQL是一种[[descriptive语言。 它没有指定查询的执行方式。它仅指定结果集的外观。 SQL编译器/优化器确定实际的处理步骤以满足查询所描述的要求。

就语义而言,FROM子句是第一个被“评估”的子句。因此,FROM

之前

WHERE子句中被逻辑处理。您的其余问题同样被误导。 where子句中的比较逻辑,例如:

from s left join t on s.series_id = t.series_id and t.series_id > 18940000 where t.incomplete = 1

将外部联接转换为内部联接。因此,逻辑与您所​​想的不同。
另一答案
正如戈登·林道夫指出的那样,您的朋友是完全错误的。

以上是关于外部连接的位置vs ON的主要内容,如果未能解决你的问题,请参考以下文章

Hive 外部表架构重新连接

10 个你可能还不知道 VS Code 使用技巧

vs 2010代码片段

vs 2010代码片段

VS code自定义用户代码片段snippet

VS2015 代码片段整理