GreenPlum 是基于 pgsql 开发的,其执行计划大多是跟 pgsql 一样的,但由于 gp 是分布式并行数据库,在 sql 执行上有很多 MPP 的痕迹,因此在理解 gp 的执行计划时,一定要将其分布式框架熟读在心,从而能够通过调整执行计划给 sql 带来很大的性能提升。

上图很好地说明了 Share Nothing 的特点:
- 底层的数据完全部共享。
- 每个 Segment 只有一部分数据。
- 每一个节点都通过网络连接在一起。
关联数据在不同节点上,对于普通关系型数据库来说,是无法进行连接的。关联的数据需要通过网络流入到一个节点中进行计算,这样就需要发生数据迁移。数据迁移有广播和重分布两种。

上图展示了 gp 中重分布数据的实现。图中,两个 Segment 分别进行计算,但由于其中一张表的关联键与分布键不一致,需要关联的数据不在同一个节点上,所以在 SLICE1 上需要将其中一个表进行重分布,可理解为在每个节点之间互相交换数据。
关于广播与重分布,gp 有一个很重要的概念:Slice(切片)。每一个广播或 重分布会产生一个切片,每一个切片在每个数据节点上都会对应发起一个进行来处理该 Slice 负责的数据,上一层负责该 Slice 的进程会读取下级 Slice 广播或重分布的数据,然后进行相应的计算。
由于在每个 Segment 上每一个 Slice 都会发起一个进程来处理,所以在 sql 中药严格控制切片的个数,如果重分布或者广播太多,应适当将 sql 拆分,避免由于进程太多给数据库或者是机器带来太多的负担。进程太多也比较容易导致 sql 失败

Slice 之间如何交互可以从上图看出。
下面通过一个实际的数据形象地介绍数据在 Segment 中的切分。比方说,对一个成绩表来说,分布键是学号(sno),我们现在要按照成绩(score)来执行 group by,那么就需要将数据按照 score 字段进行重分布,重分布前会对每个 Segment 的数据进行局部汇总,重分布后,同一个 score 的数据都在同一个 Segment 上,再进行一次汇总即可,数据的具体情况如图所示。

Redistribute Motion(N:N) :
当需要做跨库关联或者聚合的时候,当数据不能满足广播的条件,或者广播的消耗过大时,gp 就会选择重分布数据,即数据按照新的分布键(关联键)重新打散到每个 Segment 上,重分布一般在以下三种情况下发生:
- 关联:将每个 Segment 的数据根据关联键重新计算 hash 值,并根据 gp 的路由算法路由到目标子节点中,使关联时属于同一个关联键的数据都在同一个 Segment 上。
- group by :当表需要 group by ,但是 group by 的字段不是分布键时,为了使 group by 的字段在同一个库中,gp 会分两个 group by 操作来执行,首先,在单库上执行一个 group by 操作,从而减少需要重分布的数据量;然后将结果数据按照 group by 字段重分布,之后在做啊聚合获得最终结果。
- 开窗函数:跟group by 类似,开窗函数(Window Function)的实现也需要将数据重分布到每个节点上进行计算,不过其实现比 group by 更复杂一些。
官方是这样描述:
Optimal distributions are critical when joining large tables together. To perform a join, matching rows must be located together on the same segment. If data is not distributed on the same join column, the rows needed from one of the tables are dynamically redistributed to the other segments. In some cases a broadcast motion, in which each segment sends its individual rows to all other segments, is performed rather than a redistribution motion, where each segment rehashes the data and sends the rows to the appropriate segments according to the hash key.
参考:
https://gpdb.docs.pivotal.io/6-5/admin_guide/distribution.html
https://www.jianshu.com/p/25ce3b0c930d




