GreenPlum数据分布以及执行计划

执行计划/数据分布情况

1.Gather Motion (N:1),聚合,每个节点将表查询后的数据发到主节点master上聚合起来,哪个节点的数据先返回就将此数据先放在master上。

2.Redistribute Motion (N:N) ,重新分布,利用join的列值hash不同,将新的分布键(关联键)重新打散到每个segment重新分布。 3.Broadcast Motion (N:N) ,广播,将表的数据全量的发送到每一个节点进行,即每个节点相当于一份全量数据去进行join等操作。

1.当进行join操作时,如果发生广播,GP会优先将小表广播到各个segment上,如果关联表都很大,则广播数据网络就会成为瓶颈。

2.当关联的多表的分布键和关联键相同,在单库查询时,就不会造成广播和重分布。

3.如果关联的2个表,A表关联键是分布键,B表不是,执行计划则通过2表的数量集采用2种方式来实现表关联。

(1)根据B表的关联键重新分布,发布到各个节点,然后各个节点的数据内部join。

(2)将A表广播,每个节点都放置一份全量A数据,再与各表的B数据关联。

GP案例

1.演示  选择正确的分布键   db_zbtest

SELECT count(*) 
FROM db_zbtest.t_ajhz a
WHERE EXISTS (SELECT 1 FROM db_zbtest.t_gzhz_aj b WHERE a.c_bh_aj = b.c_bh_aj) ;

--数据量
select 't_ajhz', count(1) from db_zbtest.t_ajhz
union ALL
select 't_gzhz_aj', count(1) from db_zbtest.t_gzhz_aj


--原始默认分布键
alter table db_zbtest.t_gzhz_aj  set distributed by (c_bh_gz);
--分布键
alter table db_zbtest.t_gzhz_aj  set distributed by (c_bh_aj);

--数据分布
select gp_segment_id,count(1) from db_zbtest.t_gzhz_aj group by gp_segment_id


2.演示  类型转换     db_zdlx (速度相差不太明显)

SELECT count(*) 
FROM db_zdlx.t_ajhz a
WHERE EXISTS (SELECT 1 FROM db_zdlx.t_gzhz_aj b WHERE a.c_bh_aj = b.c_bh_aj) ;


--类型转换
alter table db_zdlx.t_gzhz_aj alter column c_bh_aj type varchar(900) 

--整理
VACUUM ANALYZE db_zdlx.t_gzhz_aj;


3.联合分布键(分布键和索引的不同)

所谓分布键 就是gp底层通过某种算法将数据均匀分配到各节点上的一种依据

select count(1)
FROM
  db_test.t_zj zj
INNER JOIN db_test.t_hydjxx ysjb ON zj.n_zjlx = ysjb.n_nv_zjlx
AND zj.c_zjhm = ysjb.c_nv_zjhm
AND zj.c_xm = ysjb.c_nv_xm

--第一个字段默认    7-9s    
alter table db_test.t_zj  set distributed by (n_num);
alter table db_test.t_hydjxx  set distributed by (c_bh);

--默认分布键    7-9s    
alter table db_test.t_zj  set distributed by (n_zjlx);
alter table db_test.t_hydjxx  set distributed by (n_nv_zjlx);

--索引    8s

所谓创建索引 

个人理解就是将某(如A,B....F)数据拉到一起 然后进行分类 A 类 B类  等   然后 在来查相应的数据查询数据时 就直接到某类符合条件的数据中进行查找  相当于一种数据过滤


drop index db_test.i_zjlh  ;
drop index db_test.i_hydjxxlh;

create index i_zjlh on  db_test.t_zj using btree(n_zjlx, c_zjhm, c_xm);
create index i_hydjxxlh on  db_test.t_hydjxx using btree(n_nv_zjlx, c_nv_zjhm, c_nv_xm);

--联合分布键   3s
alter table db_test.t_zj  set distributed by (n_zjlx, c_zjhm, c_xm);
alter table db_test.t_hydjxx  set distributed by (n_nv_zjlx, c_nv_zjhm, c_nv_xm);


4.重新分布(2次group by 操作)

explain
select c_bh_aj,count(1) from db_zbtest.t_ajhz group by c_bh_aj

explain
select n_sfhg,count(1) from db_zbtest.t_ajhz group by n_sfhg


5.广播

select count(distinct c_bh_aj)
from db_brtest.t_gzhz_aj
where c_bh_aj not in (select c_bh_aj from db_brtest.t_ajhz where n_ajlb = 200 )

--原始默认分布键
alter table db_brtest.t_gzhz_aj  set distributed by (c_bh_gz);
--分布键
alter table db_brtest.t_gzhz_aj  set distributed by (c_bh_aj);

--原始默认分布键
alter table db_brtest.t_ajhz  set distributed by (c_bh_aj);
--随机
alter table db_brtest.t_ajhz  set distributed randomly;