表存储格式定义
云原生数据仓库AnalyticDB PostgreSQL版支持行存、列存和行列混合存储三种存储模式。您可以根据使用场景,在建表时选行存表(适合数据更新较频繁或采用INSERT方式的实时写入的场景)或列存表(适合少量列的数据查询、聚集等数据仓库应用场景)。
定义表的存储模式
如果您需要定义行存表或列存表,可以在建表语句的WITH
参数中指定存储模式。同时,WITH参数中还可以指定压缩算法和等级,详情如下表。
参数名称 | 描述 | 取值范围 |
参数名称 | 描述 | 取值范围 |
orientation | 指定表的存储模式。
|
|
compresstype | 指定表的压缩算法。 4.3和6.0版本默认值为 7.0版本默认值为 |
|
compresslevel | 指定压缩级别,较高的值表示更高的压缩率但有较慢的压缩速度。默认值为1。 | 1~9。仅支持整数 |
appendonly | 启用或禁用追加优化存储。默认值为 |
|
行存表
默认情况下,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等较多更新操作的同步。
您可以指定
orientation
参数创建行存表(ao_row)。CREATE TABLE bar (a int, b text) WITH (appendonly=true, orientation=row) DISTRIBUTED BY (a);
列存表
列存表(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);
混合存储表
仅AnalyticDB for PostgreSQL7.0版实例支持混合存储表。
分区表和非分区表均支持行列混合存储。
非分区表
将非分区表的存储引擎设置为beam即可实现行列混存。
Beam的存储分为行存Delta和PAX结构的列存Base两个部分。在数据写入时,会根据数据写入方式,自动选择合适的存储模式。当您使用INSERT INTO VALUES
等流式实时方式写入数据时,会写入行存Delta部分,以达到与行存Heap表相当的实时写入性能。当您使用COPY
或INSERT INTO SELECT
等批处理方式写入数据时,则会直接写入到列存Base部分,以达到更高的吞吐,获得更高的写入性能。
创建表时指定存储引擎为beam
CREATE TABLE testtable (a int) USING beam;
变更已存在的表的存储引擎为beam
ALTER TABLE testtable SET ACCESS METHOD beam;
分区表
以如下分区表am_partitioned为例,为您介绍如何设置分区表的行列混存的方法。
CREATE TABLE am_partitioned(x INT, y INT)
PARTITION BY HASH (x) USING heap;
创建分区时指定分区的存储模式
创建后,am_partitioned_1分区为ao_column列存。
CREATE TABLE am_partitioned_1 PARTITION OF am_partitioned FOR VALUES WITH (MODULUS 3,REMAINDER 0) USING ao_column;
创建后,am_partitioned_2分区的存储模式为行列混存。
CREATE TABLE amm_partitioned_2 PARTITION OF amm_partitioned FOR VALUES WITH (MODULUS 3,REMAINDER 1) USING beam;
变更已存在分区的存储模式
变更am_partitioned_1存储模式为ao_row行存。
ALTER TABLE am_partitioned_1 SET ACCESS METHOD ao_row;
压缩
压缩主要用于列存表或者追加写(appendonly=true
)的行存表,有以下两种类型的压缩可用。
应用于整个表的表级压缩。
应用到指定列的列级压缩。用户可以为不同的列应用不同的列级压缩算法。
目前AnalyticDB PostgreSQL版支持的压缩算法如下:
4.3 版本支持zlib、rle_type、none、auto。
6.0 版本支持zstd、zlib、rle_type、lz4、none、auto。
7.0版本支持zstd、lz4、none、auto。
您也可以指定QuickLZ压缩算法,但内部会使用zlib算法替换,另外rle_type算法只适用于列存表。
示例
创建一个列存表。
CREATE TABLE am_testtable(x INT, y INT)
WITH (orientation=column);
创建一个使用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);
- 本页导读 (1)
- 定义表的存储模式
- 行存表
- 列存表
- 混合存储表
- 非分区表
- 分区表
- 压缩