gp版本:4.1.0.0
在海量数据库中分区表是我们经常使用的技术,这样可以解决一些性能问题。在使用过greenplum的分区表和mysql的分区表技术后,发现oracle中分区表的操作和性能还是有很大优势的,尤其是到了11g以后,而且在字典表的管理方面,前两者与oracle还是不在同一个层次上,相差太远,当然这也与greenplum是基于postgre有关,毕竟是开源的,mysql也一样。不过,即便是这样,前两者还是有很大用处的,只不过用之前,一定要清楚如何在这些数据库中利用好分区技术,这样才能规避一些将来会面临的问题。
在guide中,greenplum一直强调支持任意组合的分区,支持n级子分区,但是从不提如何正确使用它们,把使用的好坏都推给使用者,总觉得这样有点推卸责任的意思,要么就是将调整优化的部分留给support人员,这样还能赚点money。
说点正题,虽然greenplum支持任意组合以及n级子分区,但我估计没多少会真这么用的,有个2级、3级就应该不错了,因为级别越多,将来的分区个数就会成倍增长,而就我个人而言(经过一些测试),觉得单表的分区个数还是控制在100个以内为好,一旦单表的分区个数达到几百个,在访问这个表(空表)时,时间就让你无法接受了(用惯了oracle的都会这么觉得),即便用where条件将该表的查询限定在单个分区,时间也是很“可观的”,可是100个分区一般情况下是不够用的,这就只有借助greenplum的特性(并行的海量数据访问)来弥补,也就是将原来数据库中多个数据量不是很大的分区合并成一个分区,以减少该表的分区个数。
还有一个常见的问题,就是在oracle中我们经常会使用 truncate partition\ drop partition 来进行分区操作,greenplum的手册中也明确写了“支持”这样的命令,但是有前提的,下面我举两个例子:
create table t(
a timestamp without time zone,
b numeric,
c numeric,
d numeric
) WITH (appendonly=true,orientation=column,compresstype=zlib,COMPRESSLEVEL=5)
distributed randomly
partition by range(a)
subpartition by list(b)
SUBPARTITION TEMPLATE(
subpartition p0 values (10),
subpartition p1 values (20),
subpartition p2 values (30),
subpartition p3 values (40),
subpartition p4 values (50)
)
( START (date '2011-01-01') INCLUSIVE
END (date '2011-01-06') EXCLUSIVE
EVERY (INTERVAL '1 day'));
在这个t表中,一级分区没有指定partitionname,由系统自动命名,二级分区已经命名了,这样写建表语句的好处就是简单,由自动自动轮训创建分区了,但是带来的代价却是不可避免的,如下:
执行 alter table t alter partition xxxx truncate partition p0; 时,我不知道 xxxx 那应该写啥,写 1 这肯定不行:
alter table t alter partition xxxx drop partition p0; 与上边一样,经过字典表的查找,最终发现这样建表一级分区没有partitionname(oracle可以查到系统自动创建时所带的name),如下:
此时,只能用 for(rank(n)) ,如
alter table t alter partition for(rank(1)) truncate partition p0; / alter table t alter partition for(rank(1)) drop partition p0;
第二个例子:
create table tt(
a timestamp without time zone,
b numeric,
c numeric,
d numeric
) WITH (appendonly=true,orientation=column,compresstype=zlib,COMPRESSLEVEL=5)
distributed randomly
partition by range(a)
subpartition by list(b)
SUBPARTITION TEMPLATE(
subpartition p0 values (10),
subpartition p1 values (20),
subpartition p2 values (30),
subpartition p3 values (40),
subpartition p4 values (50)
)
(
PARTITION c0 START ('2011-01-01 00:00:00'::timestamp without time zone) END ('2011-01-02 00:00:00'::timestamp without time zone),
PARTITION c1 START ('2011-01-02 00:00:00'::timestamp without time zone) END ('2011-01-03 00:00:00'::timestamp without time zone),
PARTITION c2 START ('2011-01-03 00:00:00'::timestamp without time zone) END ('2011-01-04 00:00:00'::timestamp without time zone),
PARTITION c3 START ('2011-01-04 00:00:00'::timestamp without time zone) END ('2011-01-05 00:00:00'::timestamp without time zone),
PARTITION c4 START ('2011-01-05 00:00:00'::timestamp without time zone) END ('2011-01-06 00:00:00'::timestamp without time zone)
)
全部由自己指定,再来看字典表:
此时,一级分区的partitionname已经存在了,我们可以使用如下命令了:
alter table tt alter partition c0 truncate partition p0; /alter table tt alter partition c0 drop partition p0;
以上是我的一点点个人总结。