1、收集統計信息vacuum full analyze ZCXT.ZCOT_PS_PROJECT; 2、檢查表的數據量分佈select gp_segment_id,count(*) from fact_table group by gp_segment_id; 3、表結構上建議創建表的時候,分佈鍵放 ...
1、收集統計信息
vacuum full analyze ZCXT.ZCOT_PS_PROJECT;
2、檢查表的數據量分佈
select gp_segment_id,count(*) from fact_table group by gp_segment_id;
3、表結構上
建議創建表的時候,分佈鍵放在最前面,接著是分區鍵,接著是大位元組的欄位到小位元組。
4、分佈鍵
把連接鍵定義為數據分佈鍵(如果多個列作為數據分佈鍵,他們應該都出現在連接中,否則還是會造成無效廣播),常用於join和where條件的列作為分佈鍵,最典型的例子是兩張做join的表都用需要連接的列作為分佈鍵。
5、寫法上
(1)、不用distinct,改用group by
(2)、UNION操作應該用UNION ALL加GROUP BY的方式進行改寫
(3)、一般不使用Index,索引的操作不超過5%
(4)關於or語法gp的OR語法效果很差,用
in (select 1 union all select 2) 代替 in (select 1 from t1) or in (select 2 from t2),
exists (select 1 union all select 2) 代替 exists (select 1 from t1) or exists (select 2 from t2),
特別是子查詢中,括弧內引用括弧外的欄位作為條件的情況,這種時候,同一張表多次引入來改寫OR語句效率都比 or高
(5)關於併列查詢
不要使用 (column_1,column_2) in (select c1,c2),而採用 exists,單欄位沒關係,2個及以上欄位效率可能存在問題
6、執行計划上避免大表的廣播
執行計劃廣播會顯示 broadcast
GreenPlum有三種數據的移動操作,會體現在執行計划上
(1)、BroadCast Motion(N:N),廣播數據。每個節點向其他節點廣播需要發送的數據。
(2)、Redistribute Motion(N:N),重新分佈數據。利用join的列值hash不同,將篩選後的數據在其他segment重新分佈
(3)、Gather Motion(N:1),聚合彙總數據,每個節點將join後的數據發到一個單節點上,通常是發到主節點master。