【问题标题】:Performance of Inner Join vs Cartesian product [duplicate]内连接与笛卡尔积的性能[重复]
【发布时间】:2023-04-09 03:52:02
【问题描述】:

可能重复:
Explicit vs implicit SQL joins

我想知道性能上的区别

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 是在内部进行笛卡尔积吗?

【问题讨论】:

  • 感谢大家分享可用的线程。我不知道我怎么没找到。所以基本上两者在性能方面都是相同的,但是 INNER JOIN 是更清晰的表示。
  • 请注意:这些都不是笛卡尔积(也称为交叉连接)。笛卡尔积是没有连接条件的连接,如select * from A,Bselect * from A inner join B。其结果是具有 cardinality(A) * cardinality(B) 行的集合。
  • @IanBjorhovde 我提到了笛卡尔积,因为条件仅适用于笛卡尔积之后。使用内部连接,我不确定情况是否相似。
  • 查询是用第一种形式还是第二种形式都没有关系,笛卡尔积也不是。 DB2 优化器永远不会执行笛卡尔积然后过滤结果以满足条件。我敢猜测,这几乎适用于任何能够执行连接的 DBMS。

标签: sql join db2


【解决方案1】:

首先,这两个操作有两个不同的目的,而笛卡尔积为您提供了一个结果,它是将一个表中的每一行连接到另一个表中的每一行。而内连接(有时称为简单连接)是 连接两个或多个表,仅返回满足连接条件的行。
现在来看你在这里写的:
在笛卡尔积的情况下,首先创建一个由 A、B、C 组成的表,然后根据给定的条件,我们得到结果。但正如你所见,这是一个繁重的过程。
另一方面,内连接只选择那些真正满足给定条件的结果。因此,它是实现最终结果的更好解决方案。
第一个是滥用SQL语言。

【讨论】:

  • 这是否意味着第二次查询总是会花费更少的时间?此外,对于内部连接来选择记录,它必须比较两个表。这种比较操作不会是一对一的。就像笛卡尔积一样?
  • @nishantv 像这样:在笛卡尔积中,首先制作一个更大的表格,然后通过选择适当的行来创建更小的表格。有点重的过程。而在内部连接中,对于这种类型的过程本身就优化了查询,只会从两个表中选择那些满足条件的行。是的,第二个总是消耗更少的“资源”。
  • 在上面提到的线程中,讨论以两个查询相似的事实结束。我想我必须等待机会在一个巨大的数据库上尝试查询。你有没有实际验证过?
  • 只是对不知情的读者的澄清。这个答案是错误的。在 MySQL、SqlServer 和 PostgreSQL 中,问题中提出的两个选项之间没有性能差异。请参阅链接的副本以获取更多详细信息。
猜你喜欢
  • 1970-01-01
  • 2016-11-22
  • 2012-02-24
  • 2011-09-18
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 2012-12-17
相关资源
最近更新 更多