表分区使用背景:

表分区用以解决特别大的表的问题。比如事实表,解决办法就是将表分成很多小且更容易管理的部分。通过让GreenPlum数据库查询优化器只扫描满足给定查询所需的数据而避免扫描大表的全部内容,分区表能够提升查询性能。

表分布与表分区的区别:

Greenplum中每个表都需要有一个分布键,如果你建表的时候没有显示使用语法DISTRIBUTED BY (column) 指定一个分布键,系统也会默认为你指定一个。分布目的是把数据打散到每个节点,打散的规则是hash或者randomly。这样在计算时可以充分利用每个节点的资源进行并行计算。

分布:DISTRIBUTED
分区:PARTITION
分区并不会改变表数据在Segment之间的物理分布。
表分布是物理的:Greenplum数据库会在物理上把分区表和未分区表划分到多个Segment上来启用并行查询处理。
表分区是逻辑的:Greenplum数据库在逻辑上划分大表来提升查询性能并且有利于数据仓库维护任务,例如把旧数据滚出数据仓库。
无论是分区表还是非分区表,在Greenplum中,数据都是分散到各个节点上的。

GreenPlum与postgresql 分区对比

分区表意思是将一个大表在物理上分割成几块,GPDB中的分区表和PostgreSQL中实现原理一样,都是用过表继承、约束来实现。
1、在PostgreSQL中,一个父表,多个子表来实现分区表,需要手动向子表插入数据,如果向父表插入数据,则直接会被插入到父表中。
2、在GPDB中,可以直接想父表插入数据,便可以根据约束直接自动向对应的子表插入数据,当分区子表不存在时,插入失败。

Greenplum官方给出的分区表示例如下:

greenplum分布式 greenplum分区表操作_greenplum分布式

语法

在CREATE TABLE时使用PARTITION BY(以及可选的SUBPARTITION BY)子句来做分区。

理解

在GPDB中对一张表做分区,实际上是创建了一张顶层(父级)表和多个低层(子级)表。 在内部, GPDB在顶级表与低级表之间创建了继承关系(类似于PostgreSQL中的继承/INHERIT功能)。

Greenplum数据库把表划分成部分(也称为分区)来启用大规模并行处理。

[一个萝卜一个坑]:
Greenplum使用表创建时定义的分区标准来创建每一个分区及其上一个可区分的CHECK约束,这个约束限制了该表能含有的数据。查询优化器使用CHECK约束来决定要扫描哪些表分区来满足一个给定的查询谓词。

Greenplum系统目录存储了分区层次信息,这样插入到顶层父表的行会被正确地传播到子表分区。

要更改分区设计或者表结构,可使用带有PARTITION子句的ALTER TABLE修改父表。

要把数据插入到一个分过区的表中,用户需要指定根分区表,也就是用CREATE TABLE命令创建的那个表。用户也可以在INSERT命令中指定分区表的一个叶子子表。如果该数据对于指定的叶子子表不合法,则会返回一个错误。不支持在DML命令中指定一个非叶子或者非根分区表。

分区方式

Greenplum数据库支持:

·范围分区(Range Partition):基于一个数字型范围划分数据,例如按照日期或价格划分。
·列表分区(List Partition):基于一个值列表划分数据,例如按照销售范围或产品线划分。
·组合分区(A conbination of both types):两种类型的组合。

决定表分区的策略:

1、表是否足够大?
通常对于大的事实表,比如数据量有几千万或者过亿,我们可以考虑使用分区表,但数据量大小并没有一个绝对的标准可以使用,一般是根据经验,以及对目前性能是否满意。
3、查询条件是否能匹配分区条件?
如果数据量足够大了,这个时候我们就需要看下是否有合适的字段能够用来分区,通常如果数据有时间维度,比如按天,按月等,是比较理想的分区字段。
4、数据仓库是否需要滚动历史数据?
通常数仓中的数据不可能一直存放,一般都会有一定的生命周期,比如最近一年等,这里就涉及到对旧数据的管理,如果有分区表,就很容易删除旧的数据,或者将旧的数据归档到对象存储等更为廉价的存储介质上。
5、按照某个规则数据是否可以被均匀的分拆?
尽可能的均分。

不要创建超过所需数量的分区。创建过多的分区可能会拖慢管理和维护工作,例如清理、恢复Segment、扩展集群、检查磁盘用量等等。

除非查询优化器能基于查询谓词排除一些分区,分区技术就不能改进查询性能。每个分区都扫描的查询运行起来会比表没有分区时还慢,因此如果用户的查询中很少能实现分区排除,请避免进行分区。请检查查询的解释计划来确认分区被排除。

警告: 请对多级分区格外谨慎,因为分区文件的数量可能会增长得非常快。例如,如果一个表被按照日和城市划分并且有1,000个日以及1,000个城市,那么分区的总数就是一百万。列存表会把每一列存在一个物理表中,因此如果这个表有100个列,系统就需要为该表管理一亿个文件。

在选定一种多级分区策略之前,可以考虑一种带有位图索引的单级分区。索引会降低数据装载的速度,因此推荐用用户的数据和模式进行性能测试以决定最佳的策略。