greenplum下分区表的缺陷之处

本文对比分析了Greenplum、MySQL和Oracle在分区表技术的应用,指出Oracle在11g之后的优势,特别是对于字典表管理的优越性,以及与Greenplum和MySQL之间的差异。文章提供了关于如何有效利用分区技术的建议,并讨论了Greenplum支持的任意组合分区和n级子分区的使用限制。同时,文中指出了Greenplum和MySQL在分区操作上的局限性,例如在调整和优化方面的不足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

gp版本:4.1.0.0

在海量数据库中分区表是我们经常使用的技术,这样可以解决一些性能问题。在使用过greenplum的分区表和mysql的分区表技术后,发现oracle中分区表的操作和性能还是有很大优势的,尤其是到了11g以后,而且在字典表的管理方面,前两者与oracle还是不在同一个层次上,相差太远,当然这也与greenplum是基于postgre有关,毕竟是开源的,mysql也一样。不过,即便是这样,前两者还是有很大用处的,只不过用之前,一定要清楚如何在这些数据库中利用好分区技术,这样才能规避一些将来会面临的问题。

在guide中,greenplum一直强调支持任意组合的分区,支持n级子分区,但是从不提如何正确使用它们,把使用的好坏都推给使用者,总觉得这样有点推卸责任的意思,要么就是将调整优化的部分留给support人员,这样还能赚点money。026.gif

说点正题,虽然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 这肯定不行:

10037372_201109141629321.jpg

alter table t alter partition xxxx drop partition p0; 与上边一样,经过字典表的查找,最终发现这样建表一级分区没有partitionname(oracle可以查到系统自动创建时所带的name),如下:

10037372_201109141632151.jpg

此时,只能用 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)
  )

全部由自己指定,再来看字典表:

10037372_201109141641271.jpg

此时,一级分区的partitionname已经存在了,我们可以使用如下命令了:

10037372_201109141642491.jpg

alter table tt alter partition c0 truncate partition p0; /alter table tt alter partition c0 drop partition p0;

以上是我的一点点个人总结。

fj.pnggp1.jpg

fj.pnggp2.jpg

fj.pnggp3.jpg

fj.pnggp4.jpg

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10037372/viewspace-707422/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10037372/viewspace-707422/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值