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).
您可以手动添加分区或开启自动分区功能。