执行计划/数据分布情况
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;