表存储格式定义

更新时间:2025-02-20 09:48:49

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

定义表的存储模式

如果您需要定义行存表或列存表,可以在建表语句的WITH参数中指定存储模式。同时,WITH参数中还可以指定压缩算法和等级,详情如下表。

参数名称

描述

取值范围

参数名称

描述

取值范围

orientation

指定表的存储模式。row 表示行存储,column 表示列存储。默认值为row

说明

WITH参数不支持设置行列混存模式。如需设置行列混存,请参见混合存储表

  • row

  • column

compresstype

指定表的压缩算法。

4.36.0版本默认值为none,表示不使用压缩算法。

7.0版本默认值为auto,表示根据数据的特点和系统配置自动选择最合适的压缩算法。

  • 4.3 版本支持zlib、rle_type、none、auto。

  • 6.0 版本支持zstd、zlib、rle_type、lz4、none、auto。

  • 7.0版本支持zstd、lz4、none、auto。

compresslevel

指定压缩级别,较高的值表示更高的压缩率但有较慢的压缩速度。默认值为1。

1~9。仅支持整数

appendonly

启用或禁用追加优化存储。默认值为false

  • true

  • false

行存表

默认情况下,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外,即支持UPDATEDELETE等较多更新操作的同步。

  • 您可以指定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的存储分为行存DeltaPAX结构的列存Base两个部分。在数据写入时,会根据数据写入方式,自动选择合适的存储模式。当您使用INSERT INTO VALUES等流式实时方式写入数据时,会写入行存Delta部分,以达到与行存Heap表相当的实时写入性能。当您使用COPYINSERT 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)
  • 定义表的存储模式
  • 行存表
  • 列存表
  • 混合存储表
  • 非分区表
  • 分区表
  • 压缩
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等