Greenplum分区表的原理和postgresql的原理相同,都是把一张大表进行按照适合的维度进行分割,通过表的继承,规则,约束实现的。
在Greenplum中,一个表是否分区表保存在pg_partition中.
GP在建表的时候会有一个DISTRIBUTED BY选项,这个是表进行物理拆分,理解一下分区和分布:
1.分区,按照字段逻辑进行逻辑划分的区域,比如,时间按天,按月等等
2.分布,按照字段进行物理分区,会分散到每个segment
分布式为了并行查询效率,充分利用每个segment节点的资源,分区是为了减少查询时的数据扫描,对大表维护更加方便。
支持的分区类型:
范围分区
列表分区
组合分区
实例:
create table test_partition (id int,sex varchar(1))
distributed by (id)
partition by list(sex)
(partition man values ('M'),
partition woman values ('W'),
default partition other);
NOTICE: CREATE TABLE will create partition "test_partition_1_prt_man" for table "test_partition"
NOTICE: CREATE TABLE will create partition "test_partition_1_prt_woman" for table "test_partition"
NOTICE: CREATE TABLE will create partition "test_partition_1_prt_other" for table "test_partition"
insert into test_partition values(1,'M');
insert into test_partition values(2,'M');
insert into test_partition values(3,'M');
insert into test_partition values(4,'W');
insert into test_partition values(5,'W');
insert into test_partition values(6,'W');
insert into test_partition values(7,'W');
insert into test_partition values(8,'O');
insert into test_partition values(9,'O');
SELECT gp_segment_id,count(*) from test_partition group by 1;
gp_segment_id | count
---------------+-------
8 | 1
62 | 1
47 | 1
57 | 1
52 | 1
13 | 1
3 | 1
42 | 1
18 | 1
可见分布在不同的segment
查看分区:
gpadmin=# select * from test_partition_1_prt_man;
id | sex
----+-----
1 | M
2 | M
3 | M
(3 rows)
gpadmin=# select * from test_partition_1_prt_woman;
id | sex
----+-----
7 | W
4 | W
5 | W
6 | W
(4 rows)
gpadmin=# select * from test_partition_1_prt_other;
id | sex
----+-----
8 | O
9 | O
(2 rows)
参考:
http://gpdb.docs.pivotal.io/500/admin_guide/ddl/ddl-partition.html#topic_tvx_nsz_bt
可见分区表存储了相关分区的记录
*****************************************************
对于大数据量的表我们通常会对其按照一定规则进行分区存储,以便提高查询效率,下面简单对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));对带模板的子分区表单独删除某个父分区下的子分区不影响分区模板。
本文来源:https://blog.csdn.net/hellojoy/article/details/89673317