greenplum屬於MPP數據庫的一種,也是建立數據倉庫的常用MPP database。greenplum 對於分區表的數據是採用單個表,即分區表是獨立的一個邏輯表和物理表,則每個分區有單獨的自己的索引等信息,非常適合大數據增量流程的構建。
分區表:
支持rang和list以及兩者混合的分區選項,無限制子分區層級數量;rang分區鍵只能有一個,適用於時間、數字範圍的分區,list可以有多個分區鍵,適用於字符值的分區。使用時間分區的時候建議採用最細粒度的平面分區而不是多層級的分區,平面分區有更佳的查詢速度,多級分區有更好的查詢計劃分析時間。
分區表使用限制,分區鍵必須包含主鍵或者唯一鍵;
RAND範圍分區:
partiton by range(date) (start (date '2014-01-01') inclusive end (date '2015-01-01') exclusive,every(interval '1 month'))
LIST列表分區:
partiton by list(region) (partition prtusa values('usa'),partition prtchina values('china'),default prtother other)
分區的選擇性,查詢計劃只能對穩定的比較運算符執行選擇性掃描:= < <= > >= <>,不能選擇不穩定的函數,比如時間,但是可以對日期選擇比較
1、交互分區方式可以替換分區表中的某個分區,典型地,當前分區爲非壓縮表,可以構建相同數據的壓縮表替換掉這個分區。
-1.創建分區轉換臨時表
CREATE TABLE my_schema.for_exchange
with (APPENDONLY=true, COMPRESSLEVEL=9)
as (select * from my_schema.current_partition)
DISTRIBUTED BY (day_id, fst_agc_offc_cd, carr_cd, flt_nbr);
--3.比較數據內容
select 'org',count(*) from my_schema.current_partition group by 1
union
select 'new',count(*) from my_schema.for_exchange group by 1
===============================================================
"new";35375423
"org";35375423
===========================================================
--4.交換分區
alter table my_schema.schl_pnrd_daily exchange partition month201303 with table my_schema.for_exchange
--5.檢驗交換無問題
select 'org',count(*) from my_schema.current_partition group by 1
union
select 'new',count(*) from my_schema.for_exchange group by 1
"new";35375423
"org";35375423
-- 6.刪除交換出去的分區
drop table my_schema.for_exchange
2、增量數據更新
CREATE TABLE dw1.t_m_user_ugc_playvideo_details
(f_platform INTEGER,
f_uid CHARACTER VARYING,
f_day INTEGER,
f_hour INTEGER,
f_vid BIGINT,
f_catecode INTEGER,
f_userid CHARACTER VARYING,
f_videolength BIGINT,
f_site SMALLINT,
f_speed INTEGER,
f_suspend INTEGER,
f_backward INTEGER,
f_slide INTEGER,
f_playtime INTEGER
)
DISTRIBUTED BY (f_uid) PARTITION BY LIST (f_day)(
PARTITION p20141109 VALUES (20141109),
PARTITION p20141110 VALUES (20141110)
);
CREATE TABLE tempschema.t_m_user_ugc_playvideo_details
(
f_platform INTEGER,
f_uid CHARACTER VARYING,
f_day INTEGER,
f_hour INTEGER,
f_vid BIGINT,
f_catecode INTEGER,
f_userid CHARACTER VARYING,
f_videolength BIGINT,
f_site SMALLINT,
f_speed INTEGER,
f_suspend INTEGER,
f_backward INTEGER,
f_slide INTEGER,
f_playtime INTEGER
)
DISTRIBUTED BY (f_uid);
alter table dw1.t_m_user_ugc_playvideo_details
add partition p20141109 VALUES(20141109);
alter table dw1.t_m_user_ugc_playvideo_details drop partition if exists 20141109;
增量數據放到一個臨時表裏面:tempschema.t_m_user_ugc_playvideo_details,用該表的數據提供目的表:dw1.t_m_user_ugc_playvideo_detailsde 的分區如p20141109
alter table dw1.t_m_user_ugc_playvideo_details exchange partition p20141109
with table tempschema.t_m_user_ugc_playvideo_details ;