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 来对比学习一下。
-
shuffle 阶段:分别将两个表按照连接键进行分区,将相同连接键的记录重分布到同一节点,数据就会被分配到尽量多的节点上,增大并行度。
-
hash join 阶段:每个分区节点上的数据单独执行单机 hash join 算法。