AnalyticDB for PostgreSQL支持多种存储格式。当您创建一个表时,可以选择表的存储格式为行存表或者列存表。

行存表

默认情况下,AnalyticDB for PostgreSQL 创建的是行存表(Heap Table),使用的 PostgreSQL 堆存储模型。行存表适合数据更新较频繁的场景,或者采用INSERT方式的实时写入的场景,同时当行存表建有B-Tree索引时,具备更好的点查询数据检索性能。

示例:

下述语句创建了一个默认堆存储类型的行存表。
CREATE TABLE foo (a int, b text) DISTRIBUTED BY (a);
说明 当采用数据传输服务 DTS 写入 ADB PG数据时,ADB PG的目标表应设计为行存表,而不要采用列存表。DTS 为准实时数据同步方式,除INSERT 外,即支持 UPDATE 和 DELETE 等较多更新操作的同步。

列存表

列存表(Column-Oriented Table)的按列存储格式,数据访问只会读取涉及的列,适合少量列的数据查询、聚集等数据仓库应用场景,在此类场景中,列存表能够提供更高效的I/O。但列存表不适合频繁的更新操作或者大批量的INSERT写入场景,这时其效率较低。列存表的数据写入建议采用COPY等批量加载方式。列存表可以提供平均 3-5倍的较高数据压缩率。

示例:

列存表必须是追加优化表。例如,要创建一个列存表,必须指定为 "appendonly=true" 。
CREATE TABLE bar (a int, b text) 
    WITH (appendonly=true, orientation=column)
    DISTRIBUTED BY (a);

压缩

压缩主要用于列存表或者追加写("appendonly=true")的行存表,有以下两种类型的压缩可用。
  • 应用于整个表的表级压缩。
  • 应用到指定列的列级压缩。用户可以为不同的列应用不同的列级压缩算法。
目前AnalyticDB for PostgreSQL支持的压缩算法如下:
  • 4.3 版本支持zlib、rle_type
  • 6.0 版本支持zstd、zlib、rle_type、lz4
说明 也可以指定QuickLZ压缩算法,但内部会使用zlib算法替换,另外rle_type算法只适用于列存表。

示例:

创建一个使用zlib压缩且压缩级别为5的列存表。
CREATE TABLE foo (a int, b text) 
   WITH (appendonly=true, orientation=column, compresstype=zlib, compresslevel=5);
创建一个使用zstd压缩且压缩级别为9的列存表。
CREATE TABLE foo (a int, b text) 
   WITH (appendonly=true, orientation=column, compresstype=zstd, compresslevel=9);