数据库引擎实际执行的两个表之间的连接如何?

我确信,在另一个表的所有元组上列出一个元组不能是执行连接的方法。这只是一种理解输出外观的一种方式。否则,对于两个包含1000个元组的表,连接将准备一个1000*1000元组的中间数据集!这很难相信。

有帮助吗?

解决方案

有多种方法取决于DBMS认为所需的内容,而与数据库中的帮助有关。

  1. 从第一个表中读取一行,然后从第二个表中读取任何匹配行。当您要求几行并且有索引以支持第二个表的读取时,这是首选方法。
  2. 匹配索引扫描,从第一表的索引中选择所需的集合,然后将此集匹配到第二个表的索引(通常是在排序之后),然后获取所需的行。通常,使用此方法,在特定序列中请求大量行。
  3. 蛮力,从第一表中获取所有行,然后将它们整理到正确的序列中,然后从第二个表中获取所有行,然后将它们排成正确的序列,然后合并结果。通常,当没有可用索引来支持联接时,使用此方法。它是一只性能的猪,只有在其他任何事情都不会使用的地方。

从RDBM到RDBM的这三种方法有很多变化,更昂贵的商业数据库具有数十种微妙的优化,它们将根据情况使用。

其他提示

我的理解:让我们考虑两个表A和B(关系是一对一的)。 JOIN创建一个来自A和B的请求字段的临时表,对于B的每一行,以及表B中的请求字段,都附加了表A行的所需字段,其主键等于B的外键。

太糟糕了,这只是我的想法,所以它们可能不是您想要的。

好吧,如果您没有额外的过滤器,则需要1000 * 1000行的数据集。

但是,如果您有其他条件,则使用的策略必须取决于该条件。您的问题没有一般答案。

例如,PostgreSQL使用三种不同的策略进行连接,具体取决于情况。您可以阅读有关它们的信息 这里.

您可以通过发出您的查询之前选择哪种策略来获取哪种策略 EXPLAIN, , 喜欢

EXPLAIN SELECT * FROM t1 LEFT JOIN t2 ON t1.a > t2.b

研究该输出通常可以通过选择更强大的联接策略来重新设计状况来改善查询的有价值的提示。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top