天天看点

阿里云HybridDB for PG实践 - 列存储加字段和默认值

postgresql , greenplum , 相对偏移 , 列存储 , appendonly , ao表

greenplum的append only table支持更新、删除。通过什么支持呢?bitmap文件,标记被删除的行。

因此在更新,删除后,数据可能膨胀。

另一方面,列存储每列一个文件,同一行通过偏移对应起来。例如int8的两个字段,通过偏移很快能找到某一行的a列对应的b列。

接下来谈谈加字段,在加字段时,ao表示不会rewrite table的。如果ao表以及有一些垃圾(被删除的数据)记录后,加的字段会使用相对偏移吗(换句话说,需不需要填充已删除的记录),答案是要填充。

1、创建3张ao列存表。

2、前两张分别插入1000万记录,最后一张插入2000万记录。

3、分析表,并记录它们的大小

4、更新第一张表,全表更新。并记录更新后的大小,翻了一倍。

5、对三个表添加字段,设置默认值。

6、分析表,查看表的大小。

很显然,ao表在添加字段时,以已有文件的记录数为准(即使全部都删除了,也需要在新增字段上初始化这个值),。

如果有相对偏移量的概念,至少tbl2可以忽略前1000万行的偏移。

堆表不存在这个问题,因为堆表加字段会rewrite全表。

<a href="https://github.com/digoal/blog/blob/master/201708/20170817_01.md">《如何检测、清理greenplum垃圾 - 阿里云hybriddb for pg最佳实践》</a>