Greenplum表存储类型

Greenplum中支持行存储和列存储,支持堆表和AO(append only)表。

堆表和AO表:
1、堆表
Greenplum中默认和pg中一样都是使用堆存储表,堆表最适合于较小的表,适合更新、插入较频繁的表,在OLTP类型负载下表现最好。另外堆表的所有变更都会产生REDO,可以实现时间点恢复。但是堆表不能实现逻辑增量备份(因为表的任意一个数据块都有可能变更,不方便通过堆存储来记录位点)。

2、AO表
AO表顾名思义指只追加的表。其原理是,删除更新数据时,通过另一个BITMAP文件来标记被删除的行,通过bit以及偏移对齐来判定AO表上的某一行是否被删除。AO表非常适合OLAP场景,批量的数据写入,高压缩比,逻辑备份支持增量备份,因此每次记录备份到的偏移量即可。加上每次备份全量的BITMAP删除标记(很小)。

行存和列存:
1、行存
以行的方式存储数据。因此读取数据的时候需要一行一行来获取,所以访问第一列和访问最后一列的成本实际上是不一样的。

2、列存
将数据以列为形式组织。读取任一列的成本是一样的,但是如果要读取多列,需要访问多个文件,访问的列越多,开销越大。适合于在少量列上计算数据聚集的数据仓库负载,或者是用于需要对单列定期更新但不修改其他列数据的情况。

例子:
1、创建堆表
默认的存储类型就是面向行的堆表。

postgres=# CREATE TABLE t1(id int) distributed by(id);
CREATE TABLE

我们可以使用with子句来声明建表的存储类型,例如创建一个AO表:

postgres=# CREATE TABLE t1(id int)
postgres-# with (appendonly=true)
postgres-# distributed by (id);
CREATE TABLE

2、创建列存储的表
列存表的前提是必须得是AO表,不可以是堆存储的表。

postgres=# CREATE table t1(id int,info text)
postgres-# with (appendonly=true,orientation=column)
postgres-# distributed by (id);
CREATE TABLE

对于AO表,gp中还支持两种压缩的方式:表级压缩和列级压缩。

例如我们创建一个压缩表:

postgres=# CREATE TABLE foo (a int, b text)
postgres-# WITH (appendonly=true, compresstype=zlib, compresslevel=5)
postgres-# distributed by (a);
CREATE TABLE

修改表的存储类型:
表存储、压缩和存储方向只能在创建时声明。要改变存储类型,我们必须创建一个新的表,再把原始表的数据载入到新表中,接着删除原始表并且把新表重命名为原始表的名称。用户还必须重新授权原始表上有的权限。

发布了97 篇原创文章 · 获赞 25 · 访问量 8108

猜你喜欢

转载自blog.csdn.net/weixin_39540651/article/details/104051578
今日推荐