GreenPlum--表存储方式选择

本文主要讨论的是GP中在创建表时可以选择的表的存储方式,有两类:
1、行存储,列存储
2、堆存储还是追加优化存储

首先我们来讨论一下行存和列存

行存储的具体形式:

行方向是传统的存储数据库元组的方式。
组成一行的列被连续地存储在磁盘上,因此整个行可以被以单次I/O从磁盘上读出。
行存储是行为单位存储数据,一行中越是靠后的列,那么查询需要的cost相对越大,这个以前oracle做过相应比较,都是一样的道理,行存储更适合OLTP的系统

列存储的具体形式

面向列的方式把列值在磁盘上存在一起。对每一列都会创建一个单独的文件。
如果表被分区,则会对每个列和分区的组合创建一个单独的文件。当一个查询在一个有很多列的列存表中访问少量列时,I/O代价会比行存表要减少很多,因为不必从磁盘上检索没有被引用的列。

行存的适用场景:

更新并且频繁执行插入的事务的交易型负载
查询中需要单个行的很多列

列存的适用场景:

查询中只访问列的一个小集合
定期更新单个列但不修改行中其他列的表
为追求压缩

列存可以看做是对行存的一种优化:

面向列的存储是为了读操作而优化,但它并未对写操作优化,一行的列值必须被写入到磁盘上的不同位置。

列存的另一个好处是,同一种数据类型的值集合可以用比混合类型值集合更少的空间存储在一起,因此列存表比行存表使用的磁盘空间更少(进而导致需要更少的磁盘I/O)。列存表的压缩效果也比行存表更好。

有必要理解每个列都是Greenplum数据库中每个Segment上一个单独的物理文件。

然后我们谈谈堆存储和最佳优化存储:
堆表,我们普通的创建的表默认都是堆表,适合频繁的更新删除操作的小表,适合OLTP系统。
抽象点就是说,下面两种情况推荐适用默认的堆表:

将收到反复UPDATE、DELETE以及单个INSERT操作的表和分区。
将收到并发UPDATE、DELETE以及INSERT操作的表和分区。

AO表可以看做是对默认堆表的优化:
AO表,适合批量数据写入,不适合单行的insert,适合大表使用,所以一般用在数据仓库系统,适合OLAP系统。
抽象的来说,下面三种情况推荐使用AO表:

为初始装载后就很少被更新并且后续只会以批操作执行插入的表和分区使用追加优化存储。
绝不要在追加优化表上执行单个INSERT、UPDATE或者DELETE操作。
并发的批量INSERT操作可以被执行但是绝不执行并发的批量UPDATE或者DELETE操作。

追加优化表中被更新和删除的行所占用的空间不会像堆表那样被有效地回收及重用,因此追加优化存储模型不适合于频繁更新的表。它的设计目标是用于一次装载、很少更新且频繁进行分析查询处理的大型表。

你可能感兴趣的:(#,GreenPlum)