1、堆表
堆表是PostgreSQL数据库原生存储格式,GreenPlum默认的存储格式。堆表存储在OLTP类型负载下表现最好,这种环境中数据会在初始载入后被频繁地修改。 UPDATE和DELETE操作要求存储行级版本信息来确保可靠的数据库事务处理。 堆表最适合于较小的表,例如维度表,它们在初始载入数据后会经常被更新。
多适合用于OLTP系统。但GreenPlum常定位是用于OLAP系统。为了更适合OLAP系统。GreenPlum提供来AO表
应用场景:
堆表是万油金;只是有些场景其他存储方式更加适合。更能提升性能。
2、AO表
AO表在4.3版本之前取意为(APPEND-ONLY,AO)。根据其意义只能追加,在4.3版本之后取意为(append-optimized,AO)追加优化。支持update/delete。跟堆表一样。但实现原理不一样。删除更新数据时,通过另一个BITMAP文件来标记被删除的行,通过bit以及偏移对齐来判定AO表上的某一行是否被删除。
追加优化表存储在数据仓库环境中的非规范表表现最好。 非规范表通常是系统中最大的表。 事实表通常成批地被载入并且被只读查询访问。 将大型的事实表改为追加优化存储模型可以消除每行中的更新可见性信息负担,这可以为每一行节约大概20字节。 这可以得到一种更加简洁并且更容易优化的页面结构。 追加优化表的存储模型是为批量数据装载优化的,因此不推荐单行的INSERT语句
AO支持压缩以及列存
应用场景:
- 使用列存、压缩数据使用AO表。
- 数据批量写入使用AO表
3、行存和列存
ORIENTATION=COLUMN可以指定创建列存的AO表。列存的表只能是AO表。
- 行存:以行形式存储表中。一行数据存在一个数据文件中。适用于具有许多迭代事务的OLTP类型的工作负载以及一次需要多列的单行,因此检索是高效的
- 列存:以列为形式组织存储,每列对应一个或一批文件。而且压缩比例比较高。适合于在少量列上计算数据聚集的数据仓库负载,或者是用于需要对单列定期更新但不修改其他列数据的情况
若一个宽表。在读取某一个列数据;行存需要把匹配的列的所在的行数据块都要扫描一遍。整好列存可以避免。但是带来的问题是一个表对应多个数据文件。