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;


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章