表存储格式定义

云原生数据仓库AnalyticDB PostgreSQL版支持行存和列存两种存储模式。您可以根据使用场景,在建表时选行存表(适合数据更新较频繁或采用INSERT方式的实时写入的场景)或列存表(适合少量列的数据查询、聚集等数据仓库应用场景)。

行存表

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

示例:

下述语句创建了一个默认堆存储类型的行存表。

CREATE TABLE foo (a int, b text) DISTRIBUTED BY (a);
说明

当采用数据传输服务DTS写入 云原生数据仓库 AnalyticDB PostgreSQL 版数据时,云原生数据仓库 AnalyticDB PostgreSQL 版的目标表应设计为行存表,而不要采用列存表。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 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);