数据库:JOIN 与笛卡尔积

Posted

技术标签:

【中文标题】数据库:JOIN 与笛卡尔积【英文标题】:Database : JOIN vs Cartesian Product 【发布时间】:2015-08-04 10:06:26 【问题描述】:

我真的很想知道在等效 SQL 查询中,与笛卡尔积相比,使用 JOIN 是否有任何性能提升。

或连接只是笛卡尔积的语法糖。

谁能告诉我笛卡尔积和JOIN的实现。 执行是否明智,两者都需要相同的时间复杂度。或者实现因数据库而异。

我已阅读以下帖子,但似乎对此仍有分歧:

Performance of Inner Join vs Cartesian product

Explicit vs implicit SQL joins

【问题讨论】:

从您写的内容来看,我只能得出结论,您正在优化某些东西,但不知道什么是笛卡尔积,也不知道什么是 JOIN。清除 XY 问题的案例。您对 theta 加入与常规加入有何疑问? 我已要求提供等效查询。对于相同的结果,当使用笛卡尔积(连同 where 过滤器)并使用 JOIN 做同样的事情时。如果是 CP:它是否首先创建笛卡尔积,然后执行“where”子句过滤器。或过滤发生在第二个内循环内。 (如果我们使用两个表)。如果笛卡尔积足够大,那么在两遍中创建结果集需要大量时间,而如果在迭代时过滤结果,则不需要第二遍,这比第一种方法更快。 笛卡尔积是一种数学运算,正如您所说,在 SQL 中,它是一个 JOIN。因此,如果两者相同,则 JOIN 不能比 JOIN 快。您链接的那个称为theta-style JOIN,我认为这就是您认为的笛卡尔积。两个 JOIN 之间没有“区别”,mysql 不会花太多时间解析该信息。但是,您可以自行得出结论,与使用所有列计时的所有行相比,检索您需要的数据是否更快。你在混合苹果和橙子,你没有帮助任何人帮助你。 XY 问题,请阅读。 @NB :我了解您要传达的内容(将关系代数名称与 SQL 混合,即使我已经用 where 子句清楚地解释了 CP),但仍然没有得到我的答案问。如果可能的话,让我知道以下查询在性能方面是否相同:(从 A 内部连接表 B 中选择 * A.id =B.id;)和(从 A,B 中选择 *,其中 A.id = B.id ;)。带有连接的查询如何执行并且与第二个查询不同。这些查询的执行是如何发生的。如果可能的话,您能否以编程方式告诉我这些查询如何执行以生成所需的结果。 您评论中的两个查询不相同。第二个返回更多数据。它更慢。 【参考方案1】:

无法评论,没有足够的代表。但是笛卡尔积提供了所有列,而不是您特别需要的列。这不会导致数据库性能问题,但是当您开始使用数据时,可能需要额外的工作来格式化您需要显示给最终用户的内容,从而导致代码中的性能问题。随着数据库的增长和潜在的扩展,可能会引入错误,我会避免使用笛卡尔。

【讨论】:

【参考方案2】:

我可能完全错了,但这是我的观点。在一些大学数据库课程中,他们将 OP 描述的连接表的方法称为笛卡尔连接,因为基于矩阵或向量的笛卡尔积,而不是显式连接子句,这可能是 OP 如此称呼的原因.回想起来,数学是计算机的基础,它用于 SQL 语言的词汇和逻辑规范,特别是关系代数和关系微积分。我们在大学里学习了 SQL,而不是行业术语。我认为这就是学术界和工业界脱节的原因,理论与基于趋势商业实践的市场/适销对路的应用。我也认为将商业纳入学术界并不是一个好主意,除非出于各种原因与商业相关的课程。或许,一点点的谦卑,就能帮助人类走向更大的启蒙和进步。最伟大的思想有很多关于我们的知识感等创造的幻想的引述。没有限制和僵化的理解。

【讨论】:

以上是关于数据库:JOIN 与笛卡尔积的主要内容,如果未能解决你的问题,请参考以下文章

spark join 引发“检测到 INNER 连接的笛卡尔积”

12c OCP考试专项 [1z0-071]-Q15: cross join 笛卡尔积(2020.06.18)

MySQL中inner join 和 cross join 的区别

Pandas 等效于 SQL CROSS JOIN(笛卡尔积)[重复]

sql join 的语句怎么写?

mysql关系数据操作