7.0版自动分区

AnalyticDB PostgreSQL 7.0版支持将表定义为分区表,即可在查询时仅扫描满足查询条件的分区,以提升查询效率。当前对分区表写入数据时,分区必须存在,否则数据将写入失败。为解决这一问题,云原生数据仓库 AnalyticDB PostgreSQL 版新增自动分区功能,支持在数据写入时根据数值自动创建分区。

版本限制

  • 内核版本为v7.1.1.1及以上的AnalyticDB PostgreSQL 7.0版实例,自动分区功能默认开启。

  • 内核版本为v7.1.0.0至v7.1.1.1的AnalyticDB PostgreSQL 7.0版实例,如需开启自动分区功能,请提交工单

  • 内核版本为v7.1.0.0(不含)以下的AnalyticDB PostgreSQL 7.0版实例不支持自动分区功能。

说明

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

注意事项

  • 自动分区功能仅支持LIST分区,不支持RANGE和HASH分区。

  • 自动分区功能仅支持一级分区,不支持多级分区。

  • 在使用自动分区功能新增分区时,执行DDL语句需要升级锁。升级锁由后台自动升级,锁共有八级,此处是从三级锁RowExclusive升级为四级锁ShareUpdateExclusive。在升级过程中,可能会出现事务执行时间较长、并发事务性能下降的问题。

  • 为防止误操作创建出过多的分区影响系统稳定性,云原生数据仓库 AnalyticDB PostgreSQL 版自动创建分区数量库级别上限默认为4096(单位:个),其中包含已有的分区数量。例如已有2000个分区,则通过自动分区功能最多可创建出2096个分区。如已有4096分区,则无法通过自动分区功能再创建分区,但仍可使用ALTER TABLE ADD PARTITION语法手动创建分区,详情请参见新增分区

    说明

    如果分区数量已达到4096个,自动分区功能会失效且出现报错信息,详情如下。

    ERROR: num of partitions reaches upper bound(4096), refuse to create partition automatically. please check your sql or modify setting adbpg_auto_partitions_upper_bound.

开启/关闭自动分区功能

新建分区表时开启自动分区功能

使用auto_partition参数为新建分区表开启自动分区功能。

CREATE TABLE auto_int(a int, b int) PARTITION BY list(b) WITH (auto_partition=true);

开启后,为该表写入数据时可自动创建不存在的分区。

INSERT INTO auto_int VALUES(1,1);

可在psql中使用\d+命令(可视化客户端请在表的名称下面查看)查看分区表的详细信息。

\d+ auto_int;

详细信息如下。自动创建的分区名为auto_int_1_prt_1。

                           Partitioned table "public.auto_int"
 Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description 
--------+---------+-----------+----------+---------+---------+--------------+-------------
 a      | integer |           |          |         | plain   |              | 
 b      | integer |           |          |         | plain   |              | 
Partition key: LIST (b)
Partitions: auto_int_1_prt_1 FOR VALUES IN (1)
Distributed by: (a)
Access method: heap
Options: auto_partition=true

为已存在分区表开启自动分区功能

使用ALTER TABLE命令为已存在的分区表开启自动分区功能。

ALTER TABLE prt_int SET(auto_partition=true);

开启后,可以不指定分区执行写入操作。

INSERT INTO prt_int VALUES(1,1); 

该分区表详细信息如下。

                            Partitioned table "public.prt_int"
 Column |  Type   | Collation | Nullable | Default | Storage | Stats target | Description 
--------+---------+-----------+----------+---------+---------+--------------+-------------
 a      | integer |           |          |         | plain   |              | 
 b      | integer |           |          |         | plain   |              | 
Partition key: LIST (b)
Partitions: prt_int_1_prt_1 FOR VALUES IN (1)
Distributed by: (a)
Access method: heap
Options: optimizer=true, auto_partition=true

关闭自动分区功能

使用auto_partition参数关闭自动分区功能。

ALTER TABLE prt_int RESET (auto_partition);

此时再写入数据会报错。

INSERT INTO prt_int VALUES(2,2);

报错信息如下。

ERROR:  no Partition of relation "prt_int" found for row
DETAIL:  Partition key of the failing row contains (b) = (2).

常见问题

如何解决报错ERROR:  no partition of relation "prt_int" found for row

如果您在写入数据时遇到如下报错,说明目标分区不存在。

ERROR:  no partition of relation "prt_int" found for row
DETAIL:  Partition key of the failing row contains (b) = (1).

您可以手动添加分区或开启自动分区功能。