云原生数据仓库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);