2017-02-13 24 views
0

下面是两个不同的SQL代码之间有任何性能差异吗?第一个是left jon,与where匹配,另一个是left join,与on匹配。有/无“左连接”和在“哪里”或“上”匹配的区别?

因为我从那些sql中得到完全相同的结果/输出,但我很快就会使用更大的表(比如几十亿行),所以我不想遇到任何性能问题。在此先感谢...

select a.customer_id 
from table a, table b 
where a.customer_id = b.customer_id 


select a.customer_id 
from table a 
left join table b 
on a.customer_id = b.customer_id 
+3

问题是:你想要一个左连接还是一个内连接? – jarlh

+2

2个sql片段做不同的事情 –

+5

[坏习惯踢:使用旧式联接](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-使用老的风格,joins.aspx)。 1992年,“内连接”被添加到标准SQL中。这意味着逗号式连接已经过时了*世纪的四分之一*。 –

回答

2

这两个做不同的事情,是的,有一个性能的影响。

你的第一个例子是cross join有一个过滤器,它减少到inner join(几乎所有的策划者有足够的智慧将这一数字减少到inner join但它是一个语义和cross join过滤器)。

你的第二个是left join这意味着如果过滤器不符合,你仍然可以从表a中获得所有记录。

这意味着计划者必须假设表a中的所有记录都是相关的,并且表b中的相关记录与第二个示例中的相关,但在第一个示例中,它知道只有相关记录是相关的(因此在计划中有更多的自由)。

在一个非常小的数据集中,您将看不到任何区别,但您可能会得到不同的结果。在大型数据集中,您的left join永远不会比您的inner join表现更好,并且可能表现更差。

+0

surprinsingly很好的解释,没有任何SQL代码片段或模式:) –