分布式数据库中的大表关联(重分布)

分布式数据库中的大表关联(重分布)

Content #

现在要对 A、B 两张大表进行关联,执行下面的 SQL:

select A.C1,B.C2 from A,B where A.C1=B.C1;

这个 SQL 可能会引发两种不同的重分布操作。

第一种,如果 C1 是 A 表的分区键,但不是 B 表的分区键,则 B 表按照 C1 做重分布,推送到 A 的各个分片上,实现本地关联。

第二种,如果两张表的分区键都不是 C1,则两张表都要按照 C1 做重分布,而后在多个节点上再做本地关联。当然这种情况的执行代价就比较高了。

这个基于重分布的关联过程,其实和 MapReduce、Spark 等并行计算引擎的思路是一样的,基本等同于它们的 Shuffle 操作。我们可以用 Spark 的 Shuffle Hash Join 来对比学习一下。

  1. shuffle 阶段:分别将两个表按照连接键进行分区,将相同连接键的记录重分布到同一节点,数据就会被分配到尽量多的节点上,增大并行度。

  2. hash join 阶段:每个分区节点上的数据单独执行单机 hash join 算法。

Viewpoints #

From #

20 | 关联查询:如何提升多表Join能力?