Greenplum性能优化之路 --(一)分区表
什么是分区表
分区表就是将一个大表在物理上分割成若干小表,并且整个过程对用户是透明的,也就是用户的所有操作仍然是作用在大表上,不需要关心数据实际上落在哪张小表里面。Greenplum中分区表的原理和PG一样,都是通过表继承和约束实现的。
Greenplum官方给出的分区表示例如下:
partitions.jpg
与分布的区别
分布:DISTRIBUTED
分区:PARTITION
Greenplum中每个表都需要有一个分布键,如果你建表的时候没有显示使用语法DISTRIBUTED BY (column) 指定一个分布键,系统也会默认为你指定一个。分布目的是把数据打散到每个节点,打散的规则是hash或者randomly。这样在计算时可以充分利用每个节点的资源进行并行计算。
分区特性在本文会详细介绍,两者比较如下:
- 数据分布是在物理上拆分表数据,将数据打散到各个节点,使数据可以并行计算,这在Greenplum中是必须的。
- 表分区是在逻辑上拆分大表的数据提高查询性能,也有利于数据生命周期的管理,这在Greenplum中是可选的。
- 无论是分区表还是非分区表,在Greenplum中,数据都是分散到各个节点上的。
- 分区不会影响数据在各个节点上的分布情况。
什么时候使用分区表
是否使用分区表,可以通过以下几个方面进行考虑:
- 表数据量是否足够大:通常对于大的事实表,比如数据量有几千万或者过亿,我们可以考虑使用分区表,但数据量大小并没有一个的标准可以使用,一般是根据经验,以及对目前性能是否满意。
- 表是否有合适的分区字段:如果数据量足够大了,这个时候我们就需要看下是否有合适的字段能够用来分区,通常如果数据有时间维度,比如按天,按月等,是比较理想的分区字段。
- 表内数据是否具有生命周期:通常数仓中的数据不可能一直存放,一般都会有一定的生命周期,比如近一年等,这里就涉及到对旧数据的管理,如果有分区表,就很容易删除旧的数据,或者将旧的数据归档到对象存储等更为廉价的存储介质上。
- 查询语句中是否含有分区字段:如果你对一个表做了分区,但是所有的查询都不带分区字段,这不仅无法提高性能反而会使性能下降,因为所有的查询都会扫描所有的分区表。
创建分区表
Greenplum支持三种分区类型:
- 范围分区(Range Partition)
- 列表分区(List Partition)
- 组合分区(A combination of both *)
范围分区例子:
CREATE TABLE test_range_partition ( uid int, fdate character varying(32) ) PARTITION BY RANGE(fdate) ( PARTITION p1 START ('2018-11-01') INCLUSIVE END ('2018-11-02') EXCLUSIVE, PARTITION p2 START ('2018-11-02') INCLUSIVE END ('2018-11-03') EXCLUSIVE, DEFAULT PARTITION pdefault ); 以上例子是按天建表,如果时间跨度比较大,会导致建表语句很长,书写起来也不方便,这时候可以使用以下语法: CREATE TABLE test_range_partition_every_1 ( uid int, fdate date ) partition by range (fdate) ( PARTITION pn START ('2018-11-01'::date) END ('2018-12-01'::date) EVERY ('1 day'::interval), DEFAULT PARTITION pdefault );相关文章