数据库引擎实际上如何执行两个表之间的连接?
我确信针对另一个表的所有元组列出一个元组不能成为执行连接的方式;这只是了解输出结果的一种方式。否则,对于每个包含 1000 个元组的两个表,连接将准备一个 1000*1000 个元组的中间数据集!这很难相信。
数据库引擎实际上如何执行两个表之间的连接?
我确信针对另一个表的所有元组列出一个元组不能成为执行连接的方式;这只是了解输出结果的一种方式。否则,对于每个包含 1000 个元组的两个表,连接将准备一个 1000*1000 个元组的中间数据集!这很难相信。
有多种方法,具体取决于 DBMS 认为您想要什么以及数据库中有什么帮助。
这三种方法在 RDBMS 和 RDBMS 之间有很多变化,更昂贵的商业数据库有许多微妙的优化,它们将根据情况使用。
我的理解:让我们考虑两个表,A 和 B(关系是一对多)。JOIN 创建一个临时表,其中包含来自 A 和 B 的请求字段。对于 B 的每一行,连同来自表 B 的请求字段,附加表 A 行的所需字段,其主键等于 B 的外键。
太糟糕了,这只是我的想法,所以它们可能不是您要找的东西。
好吧,如果您没有额外的过滤器,那么 1000 * 1000 行的数据集就是您要的。
但是,如果您有其他条件,则所使用的策略必须取决于该条件。您的问题不会有一般性的答案。
例如,PostgreSQL 根据情况使用三种不同的 JOIN 策略。您可以在此处阅读有关它们的信息。
您可以通过发出前面带有 的查询来获取选择了哪种策略的信息
EXPLAIN
,例如查看此输出通常会为您提供有关如何通过以选择更强大的连接策略的方式重新制定条件来改进查询的宝贵提示。