Greenplum 的执行计划和 PostgreSQL 基本一致,但是在表关联的时候还是会有区别,因为 greenplum 中数据不同于 pg,greenplum 是将数据分布在多个节点上。所以当两表关联时关联列又不是表的分布键时就会出现表的广播和重分布。本文将详细介绍广播和重分布的区别及场景。
在此之前,我们需要先了解下在 greenplum 中表之间分布式关联有哪些类型?
表的分布式关联主要分为两大类:
1、单库关联,即表的关联键和分布键一致,所以只需要在单个库中得到结果后再关联即可,因此也不会涉及到广播和重分布;
2、跨库关联,即表的关联键和分布键不一致,因此数据需要重新分布来达到单库关联的效果,这也是本文主要讲解的地方。
对于跨库关联又分为两种情况:
2.1、一张表的关联键是分布列,另一张表不是;
2.2、两张表的关联键均不是分布列。
详细情况如下图所示 (a、b 两表中 c1 列是分布列):

下面结合实例来讲解广播和重分布的原理及场景。
构建环境:
postgres=# CREATE table a(c1 int,c2 int)distributed by(c1);
CREATE TABLE
postgres=# CREATE table b(c1 int,c2 int)distributed by(c1);
CREATE TABLE
现在主要来看看跨库关联的两种情况:
— 情况一:a.c1=b.c2
即 a 表关联键是分布列,b 表不是。这种情况可以通过两种方法来实现表的关联:
1、重分布:将 b 表按照 c2 字段将数据重新分布到每个节点上,然后再和 a 表关联。这种情况下重分布的数据量就是 b 表的数据量 N;
2、广播:将 a 表上的数据进行广播,即每个节点都放一份全量数据,然后再和 b
Greenplum与PostgreSQL关联查询:广播与重分布策略解析

本文深入探讨了Greenplum中的表关联查询,特别是当关联键非分布键时的广播和重分布操作。在单库关联中,关联键与分布键一致则无需额外操作;而在跨库关联中,根据数据量和节点数,系统会选择广播或重分布策略。当N>M*L时选择广播,反之选择重分布。通过实例展示了不同数据量和节点数下,广播与重分布的选择,并总结了这两种情况下的策略选择标准。
最低0.47元/天 解锁文章
1297





