外部连接的位置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> 18940000与temp_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中是否有性能差异:
但是这出乎我的意料,为什么第二个更快?我认为通过外部连接较小的表,查询会更快。
部分:
尽可能将谓词推入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的主要内容,如果未能解决你的问题,请参考以下文章