執行計劃/數據分佈情況
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;