【问题标题】:What actually happens during table JOINs?在表 JOIN 期间实际发生了什么?
【发布时间】:2016-12-27 02:32:27
【问题描述】:

我想看看我对JOINs的理解是否正确。

对于以下查询:

SELECT * FROM tableA 
   join tableB on tableA.someId = tableB.someId
   join tableC on tableA.someId = tableC.someId;

RDMS基本上执行类似的伪代码如下:

List tempResults
for each A_record in tableA
    for each B_record in tableB
        if (A_record.someId = B_record.someId)
            tempResults.add(A_record)

List results 
for each Temp_Record in tempResults
    for each C_record in tableC
        if (Temp_record.someId = C_record.someId)
            results.add(C_record)

return results;

所以基本上someId tableAtableBtableC 相同的记录越多,RDMS 扫描的记录就越多?如果所有 3 个表都有相同的 someId 记录,那么本质上是对所有 3 个表进行全表扫描?

我的理解正确吗?

【问题讨论】:

  • 好问题。但我不确定是否有人可以回答这个问题。 ;) 绝对感觉后面也发生了同样的事情。
  • 想了解更多 T-SQL 连接语句?这个joins 是理解他们的好文章。
  • This post ii 有用。
  • 我不确定您在问什么,您关心的是 Joining 的供应商实现,还是关系模型的基本概念?
  • @JerryChin 我对供应商的实施不感兴趣——一般来说,RDMS 内部正在发生什么,执行JOINs。

标签: mysql sql rdbms


【解决方案1】:

当然,每个供应商的查询处理器的编写(编码)略有不同,但它们可能共享许多通用技术。实现join可以有多种方式,选择哪一种,在任何厂商的实现中,将取决于具体情况,但会考虑的因素包括数据是否已经按join属性排序,每个表中记录的相对数量(一组数据中的 20 条记录与另一组数据中的一百万条记录之间的连接将不同于每组记录具有可比大小的连接)。我不知道 MySQL 的内部结构,但对于 SQL Server,有三种不同的连接技术,Merge JoinLoop JoinHash Join 。看看this

【讨论】:

  • 那么我提供的伪代码是 Loop Join 的示例吗?
  • 是的,您所做的是循环连接。如果要将一个小集合与一个非常大的集合连接起来,这种方法是合适的。当然,您遍历较小的记录,并为每条记录使用索引来查找大记录中的匹配项。
猜你喜欢
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多