内连接与笛卡尔积的性能比较

19

可能是重复问题:
显式连接和隐式连接有何区别?

我想知道显式连接和隐式连接在性能方面的差异。

select * from A,B,C where A.x = B.y and B.y = C.z

select * from A INNER JOIN B on A.x = B.y INNER JOIN C on B.y = C.z
基本上我想知道内连接是否比笛卡尔积性能更好?另外,在内连接中,笛卡尔积是否在内部执行?

感谢大家分享可用的线程。我不知道为什么我没有找到它。所以基本上两者在性能方面都是相同的,然而INNER JOIN更清晰地表示了它。 - nishantv
1
只是提醒一下:这两个都不是笛卡尔积(即交叉连接)。笛卡尔积是一种没有连接条件的连接,例如 select * from A,Bselect * from A inner join B。其结果是一个具有 cardinality(A) * cardinality(B) 行的集合。 - Ian Bjorhovde
@IanBjorhovde 我提到笛卡尔积是因为条件只适用于笛卡尔积之后。对于内连接,我不确定情况是否相似。 - nishantv
1
无论您是使用第一种形式还是第二种形式编写查询,都不会产生笛卡尔积。DB2优化器永远不会执行笛卡尔积,然后过滤结果以满足条件。我敢猜测,这适用于几乎所有能够执行连接操作的数据库管理系统。 - Ian Bjorhovde
1个回答

2
首先,这两个操作是为了两个不同的目的而存在的,笛卡尔积提供的结果是将一个表的每一行与另一个表的每一行连接在一起形成的结果集;而内部连接(有时称为简单连接)是连接两个或多个表格,仅返回满足连接条件的那些行。
现在来看你所写的内容:
在笛卡尔积中,首先创建由A、B、C组成的表格,然后根据给定的任何条件得出结果。但你会发现这是一个繁琐的过程。
另一方面,内部连接只选择真正满足给定条件的结果。因此,它是实现最终结果的更好解决方案。
第一个方法滥用了SQL语言。

这是否意味着第二个查询总是需要更少的时间?此外,对于内连接来选择记录,它必须比较两个表。这个比较操作不会是一对一的基础吗?就像形成笛卡尔积一样? - nishantv
1
@nishantv,就像这样:在笛卡尔积中,首先创建一个更大的表,然后通过选择适当的行来创建较小的表。这是一种比较繁重的过程。而在内连接中,它是针对这种类型的过程进行了优化的查询,只会选择两个表中符合条件的行。而且,第二种方法总是消耗更少的“资源”。 - user1909647
在上面提到的帖子中,讨论得出结论,这两个查询非常相似。我认为我必须等待一个机会,在庞大的数据库上尝试这些查询。你有实际验证过吗? - nishantv
17
提醒不了解情况的读者,此答案有误。在MySQL、SqlServer和PostgreSQL中,问题中提出的两个选项没有性能差异。请参考链接的重复内容获取更多细节。 - pacha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接