执行计划/数据分布情况

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_ajexplain
 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;