对于大数据量的表我们通常会对其按照一定规则进行分区存储,以便提高查询效率,下面简单对GP上分区表的创建、分区的增加和删除进行了整理。
一、创建
GP中表的分区都只能在创建表的时候定义,因此如果需要对表做分区一定要在create表的时候定义,对已经存在的表再做分区调整需要重建表并重新加载数据。
- 单层分区表
create table h_t (a int ,b varchar(10),c date)
distributed by (a)
partition by list (b)
(partition a values (’n',’N'),partition b values (’Y',’y'));
如果在list的partition value中定义null值,在where条件中限制只取为null的数据也不会走分区,会全表扫描。因此如果有null,最好是能在etl过程中做非空处理,然后再partition value中定义非空处理都的值。
- 带模板多层分区
create table h_t (a int ,b varchar(10),c date)
distributed by (a)
partition by list (b)
subpartition by range (c)
SUBPARTITION TEMPLATE
(START (date ‘2008-01-01′) INCLUSIVE ,
START (date ‘2008-01-02′) INCLUSIVE ,
start (date ‘2009-01-03′) INCLUSIVE END (DATE ‘2010-10-18′) EXCLUSIVE)
(partition a values (’n',’N'),partition b values (’Y',’y'));
- 不带模板多层分区
CREATE TABLE h_t
( stat_date DATE,member_id VARCHAR (32),a varchar(10),dw_ins_date TIMESTAMP(0) DEFAULT NOW() )
WITH(appendonly=true,compresslevel=5)
distributed by (member_id)
partition by range (stat_date)
SUBPARTITION BY list (a)
(
PARTITION P20101014 START (date ‘2010-10-14′) INCLUSIVE (SUBPARTITION sa VALUES (’sa’),SUBPARTITION asia VALUES (’asia’),SUBPARTITION europe VALUES (’europe’)),
PARTITION P20101015 START (date ‘2010-10-15′) INCLUSIVE (SUBPARTITION usa VALUES (’usa’),SUBPARTITION asia VALUES (’asia’),SUBPARTITION europe VALUES (’europe’)),
PARTITION P20101016 START (date ‘2010-10-16′) INCLUSIVE (SUBPARTITION europe VALUES (’europe’)),
PARTITION P20101017 START (date ‘2010-10-17′) INCLUSIVE END (DATE ‘2010-10-18′) EXCLUSIVE (SUBPARTITION asia VALUES (’asia’),SUBPARTITION eu VALUES (’eu’))
);
不带模板的子分区表每个子分区的定义可以不同。
二、增加分区
增加分区基础语句都为alter table [table_name] add partition [name] partition_element,单层分区的比较简单直接使用基本语句就可以了,带子分区的稍微复杂一些
- 单层分区
alter table sales add partition start (date ‘2009-02-01′) inclusive end (date ‘2009-03-01′) exclusive;
- 带模板的多层分区
- 增加父分区同单层分区一样,每添加一个父分区,系统都会自动在新加的父分区上按照模板建立子分区;
- 增加子分区模板,似乎只能在已经存在分区上修改分区模板,不可以在新增父分区的同时增加子分区模板,而且模板修改后只对指定修改的父分区和新增父分区有效,已经存在的历史父分区需要再手工增加新的子分区,语句如:alter table h_t alter partition a add partition start (date ‘2010-10-18′) INCLUSIVE END (DATE ‘2010-10-19′) EXCLUSIVE;
- 不带模板的多层分区,在新增父分区的时候可以指定子分区,如:alter table sales add partition start (date ‘2009-02-01′) inclusive end (date ‘2009-03-01′) exclusive (subpartition usa values (’usa’),subpartition asia values (’asia’),subpartition europe values (’europe’));
二、删除分区
删除分区语句为alter table [table_name] drop partition [name];删除父分区的时候子分区会被一起删除,单独删除某个子分区:alter table h_t alter partition b drop partition for (rank(1));对带模板的子分区表单独删除某个父分区下的子分区不影响分区模板。