GP支援分區表,主要用來存放大表,如fact table
目的:
1. 把大資料切片,便于查詢
2. 便于資料庫維護
分區建立時,每個分區會自帶一個Check限制,來限定資料的範圍。Check限制也用于 執行查詢時定位分區。
支援分區類型:
1. 範圍分區 range partition
2. 清單分區 list partition
3. 組合分區

(多級分區表)
-------partition 和 distribution的差別------
distribution -- 實體上拆分表資料、能并行執行查詢
partition -- 邏輯上拆分大表資料提高查詢性能、利于資料倉庫維護工作
------表分區政策------
@ 表是否足夠大?
大事實表可以選擇分區。如果一個表有幾百萬或10億資料量,你可以看到性能上的優勢。
如果隻是幾千行或者更小的表的話,dba将在維護分區花費大量的精力,小表不要建分區,直接full table scan。
@ 是否對現有性能不滿意?
當表的查詢響應時間比預期要慢的話,可以考慮用分區表
@ 是否能夠判斷查詢可以使用固定範圍或固定值來做限定條件?
where子句中是否使用分區字段。
例如:經常按日志來查詢,可以按月或周來範圍分區。或按地區來查的話,可以按地區來做清單分區。
@ 是否需要維護你資料倉庫中的大量曆史記錄?
分區設計另外一個考量是根據業務要求來決定曆史資料的儲存。
例如:資料倉庫隻要保留過去12個月的資料。如果是按月分區的話,你很容易删掉曆史分區并載入資料到目前幾個月份中。
@ 是否能基于一些定義規則将資料分成等份?
你應該選擇盡可能的将資料等分。如果分區中包含等數量記錄,則查詢性能提升基于已建立的分區數量。
例如:一個大表被分成10個分區,執行一個查詢将比非分區表快10倍。
------建立分區表------
[時間範圍分區]
2中建立方式:
==》CREATE TABLE sales (id int, date date, amt decimal(10,2))
DISTRIBUTED BY (id)
PARTITION BY RANGE (date)
( START (date '2008-01-01') INCLUSIVE
END (date '2009-01-01') EXCLUSIVE
EVERY (INTERVAL '1 day') ); --時間間隔
==> CREATE TABLE sales (id int, date date, amt decimal(10,2))
( PARTITION Jan08 START (date '2008-01-01') INCLUSIVE ,
PARTITION Feb08 START (date '2008-02-01') INCLUSIVE ,
PARTITION Mar08 START (date '2008-03-01') INCLUSIVE ,
PARTITION Apr08 START (date '2008-04-01') INCLUSIVE ,
PARTITION May08 START (date '2008-05-01') INCLUSIVE ,
PARTITION Jun08 START (date '2008-06-01') INCLUSIVE ,
PARTITION Jul08 START (date '2008-07-01') INCLUSIVE ,
PARTITION Aug08 START (date '2008-08-01') INCLUSIVE ,
PARTITION Sep08 START (date '2008-09-01') INCLUSIVE ,
PARTITION Oct08 START (date '2008-10-01') INCLUSIVE ,
PARTITION Nov08 START (date '2008-11-01') INCLUSIVE ,
PARTITION Dec08 START (date '2008-12-01') INCLUSIVE
END (date '2009-01-01') EXCLUSIVE ); --在最後要寫個end
[數字範圍分區]
==>CREATE TABLE rank (id int, rank int, year int, gender
char(1), count int)
PARTITION BY RANGE (year)
( START (2001) END (2008) EVERY (1),
DEFAULT PARTITION extra );
[清單分區]
char(1), count int )
PARTITION BY LIST (gender) --可以使用多列
( PARTITION girls VALUES ('F'),
PARTITION boys VALUES ('M'),
DEFAULT PARTITION other );
------多級分區------
==>CREATE TABLE sales (id int, year int, month int, day int,
region text)
DISTRIBUTED BY (id)
PARTITION BY RANGE (year)
SUBPARTITION BY RANGE (month)
SUBPARTITION TEMPLATE (
START (1) END (13) EVERY (1),
DEFAULT SUBPARTITION other_months )
SUBPARTITION BY LIST (region)
SUBPARTITION usa VALUES ('usa'),
SUBPARTITION europe VALUES ('europe'),
SUBPARTITION asia VALUES ('asia'),
DEFAULT SUBPARTITION other_regions )
( START (2002) END (2010) EVERY (1),
DEFAULT PARTITION outlying_years );
------普通表 轉 分區表 -------
==>CREATE TABLE sales2 (LIKE sales)
PARTITION BY RANGE (date)
EVERY (INTERVAL '1 month') );
==>INSERT INTO sales2 SELECT * FROM sales;
==>DROP TABLE sales;
==>ALTER TABLE sales2 RENAME TO sales;
==>GRANT ALL PRIVILEGES ON sales TO admin;
==>GRANT SELECT ON sales TO guest;
------選擇性分區掃描的一些限制-----
限制條件:
1. 條件中使用簡單直接的限制操作符(如:= < <= > >= <>),可以選擇性掃描分區
2. 不能識别變化性函數,隻能是固定值
例如:where語句中 date > current_date可以做範圍掃描。 但是time > timeofday則不行。
3. 不确定的值是無法做runtime評估,必須要指定明确的值
例如:SELECT * from partition_table PT, other_table OT WHERE
PT.id=OT.id and OT.some_column = 'value';
--value必須指定值
------檢視表分區-------
pg_partitions - 檢視建立分區資訊
pg_partition_templates - 檢視是用subpartition模闆建立的子分區
pg_partition_column - 檢視分區字段
關于修改表分區的文法,參考官方文檔。
原文網址:http://blog.sina.com.cn/s/blog_90474a9201013k74.html