变更Heap表或AO表为Beam表

更新时间:

云原生数据仓库 AnalyticDB PostgreSQL 版支持的存储引擎有Heap(堆表Heap Table),AO(Append-Only)和Beam。每种存储引擎都有各自的特定和适用的业务场景。当业务需求发生变化时,例如从高并发写入变为高并发读取,您可以直接变更表的存储引擎,而无需新建表并迁移原表数据。

三种存储引擎特性如下。

  • Heap:可承载OLTP业务,支持并发更新删除。默认情况下对不压缩数据。不支持高效的范围扫描。数据量较大时,存储成本比较高。随机读取通常更加耗时,且I/O容易成为瓶颈。适用于高并发写入和数据量较大但查询复杂度不高的场景。

  • AO:支持ao_row(行式存储),ao_column(列式存储)两种存储方式,但不支持设置主键。适用于高并发读取、大量写入操作和需要长期保存但访问频率较低的数据集的场景。

  • Beam:自研行列混存模型。支持数据压缩,支持设置主键,结合列裁剪和Zonemap提高筛选能力。支持设置压缩算法,降低数据存储成本。大幅降低了查询时的磁盘I/O次数,提高了I/O利用率。适用于高性能实时写入和高吞吐批量导入场景。

版本限制

内核版本为7.0.6.2及以上的AnalyticDB for PostgreSQL7.0版实例。

说明

如何查看内核版本,请参见查看内核小版本。如您的实例不满足上述版本要求,建议您升级内核小版本

注意事项

变更存储引擎时会锁表,阻塞读写。锁表的时间与数据量有关。建议您在业务低峰期变更引擎。如果较长时间未解锁,请提交工单获取技术支持。

语法

ALTER TABLE table_name SET ACCESS METHOD access_method

参数说明

access_method:要变更的存储引擎,取值为:heapbeamao_rowao_column

使用示例

变更普通表的存储引擎

以如下Heap表为例,为您介绍如何变更表的存储引擎。

CREATE TABLE testtable (i int) USING heap;
INSERT INTO testtable SELECT * FROM generate_series(1,10000);
  • 将Heap表转换为Beam表。

    ALTER TABLE testtable SET ACCESS METHOD beam;
  • 将Beam表转换为Heap表。

    ALTER TABLE testtable SET ACCESS METHOD heap;
  • 指定Beam压缩算法和压缩级别,将Heap表转化为Beam表。

    SET beam_default_storage_options = 'compresstype=auto, compresslevel=5';
    ALTER TABLE testtable SET ACCESS METHOD beam;
    说明
    • 压缩算法和压缩级别的取值,请参见压缩算法

    • 上述设置压缩算法和压缩级别为会话级别的设置。在设置过程中可能会导致读写速度变慢。

变更分区表的存储引擎

以如下分区表am_partitioned为例,为您介绍如何变更分区表和分区的存储引擎。

CREATE TABLE am_partitioned(x INT, y INT)
PARTITION BY HASH (x) USING heap;
CREATE TABLE am_partitioned_1 PARTITION OF am_partitioned FOR VALUES WITH (MODULUS 3,REMAINDER 0);
CREATE TABLE am_partitioned_2 PARTITION OF am_partitioned FOR VALUES WITH (MODULUS 3,REMAINDER 1);
  • 将所有分区的存储引擎转换为Beam。

    ALTER TABLE am_partitioned SET ACCESS METHOD beam;
  • 将单个分区的存储引擎转换为Beam。

    ALTER TABLE am_partitioned_1 SET ACCESS METHOD beam;
  • 将所有分区的存储引擎从Beam转换为Heap。

    ALTER TABLE am_partitioned SET ACCESS METHOD heap;