auto_partition
AnalyticDB PostgreSQL版支持将大表定义为分区表,并支持通过auto_partition插件对分区表进行自动删除或新增,当您进行条件查询时,系统只会扫描满足条件的分区,避免全表扫描,从而提升查询性能。
新增分区的粒度包括小时,天,星期,月,年等。其中AnalyticDB PostgreSQL 6.0版仅支持物理分区,AnalyticDB PostgreSQL 7.0版同时支持物理分区和逻辑分区。
逻辑分区:将数据库中的数据划分为逻辑上独立的部分,每个分区可以包含一个或多个表。逻辑分区子表其实是一个一级表,仅通过约束条件进行关联。
物理分区:将表和索引分割成不同的物理部分,即数据存储在不同的物理存储设备上。
安装插件
AnalyticDB PostgreSQL 6.0版安装方式:
自动安装。
auto_partition在开通向量引擎优化功能时,会自动安装。如何开通向量引擎优化功能,请参见开启或关闭向量检索引擎优化。
手动安装。
若您的实例未开通向量引擎优化功能,需要执行如下SQL,手动安装。目前暂不支持用户自行手动安装,请提交工单联系技术支持进行处理。
SET adbpg_enable_create_untrusted_function TO ON; CREATE EXTENSION auto_partition;
AnalyticDB PostgreSQL 7.0版安装方式:
分区表管理规则
分区表规则被记录到系统表pg_auto_partition_config
中,表各列信息如下:
列名 | 类型 | 默认值 | 说明 |
schema_name | text | 无 | 分区父表的Schema名称。 |
master_table | text | 无 | 分区父表名称。 |
part_col | text | 无 | 分区父表的分区列名称。 |
date_plan | text | 无 | 分区规则,取值: |
future_part_count | integer | 1 | 提前创建未来的分区数,用于提前创建分区,必须大于等于0。 |
available_part_count | integer | null,表示保留所有分区。 | 保留之前的分区数,用于删除分区,必须大于等于0。 |
case_ignore | boolean | true | 是否忽略分区表Shema名称、表名称和列名称的大小写。 |
revoke_update | boolean |
| 是否移除分区表(包括主表和分区子表)的UPDATE权限。取值说明如下:
|
revoke_delete | boolean |
| 是否移除分区表(包括主表和分区子表)的DELETE权限。取值说明如下:
|
is_physic_partition | boolean | false | AnalyticDB PostgreSQL 7.0版新增字段,设置分格式。取值说明如下:
|
分区表管理SQL
添加分区规则
添加分区规则,可以使用pg_auto_partition_register
UDF操作,具体语法如下:
SELECT pg_auto_partition_register
(part_schema, part_master, part_col, date_plan, future_part_count,
avaiable_part_count, case_ignore, revoke_update, revoke_delete,
is_physic_partition);
参数说明,请参见分区表管理规则。
返回值说明:成功则返回1,失败会报错。
对单个分区表创建分区
在添加分区规则后,可以对单个分区主表进行创建分区。对单个分区主表创建分区使用pg_auto_partition_create
UDF操作,该UDF仅创建新分区,不会删除分区,具体语法如下:
SELECT pg_auto_partition_create(part_schema, part_master);
参数说明如下。
参数 | 说明 |
part_schema | 分区表的Schema名称。 |
part_master | 分区表名称。 |
返回值说明:成功则返回创建成功的分区表数量,失败会报错。
对分区规则中的所有分区表创建分区
在添加分区规则后,对分区规则配置中的所有分区按规则进行创建。对分区配置中的所有分区主表创建分区使用pg_auto_partition_run_create
UDF操作,该UDF仅创建新分区,不会删除分区,具体语法如下:
SELECT pg_auto_partition_run_create();
返回值说明:成功则返回创建成功的分区表数量,失败会报错。
对单个分区表删除分区
在添加分区规则后,可以根据分区管理规则对单个分区主表进行删除。对单个分区主表删除分区使用pg_auto_partition_remove_old
UDF操作,该UDF仅删除分区,不会创建分区,具体语法如下:
SELECT pg_auto_partition_remove_old(part_schema, part_master, real_drop);
参数说明如下。
参数 | 说明 |
part_schema | 分区表的Schema名称。 |
part_master | 分区表名称。 |
real_drop | 是否按照分区规则中的保留分区数删除旧分区子表,默认值为false。取值说明如下:
|
返回值说明:成功则返回统计需要删除的分区表数量,失败会报错。
对分区规则中的所有分区表删除分区
在添加分区规则后,可以根据分区管理规则对配置中的所有分区主表执行删除分区操作。对配置规则中的所有分区主表进行删除分区使用pg_auto_partition_run_remove
UDF操作,该操作仅删除分区,不会创建分区,具体语法如下:
SELECT pg_auto_partition_run_remove(real_drop);
参数说明:real_drop参数和对单个分区表删除分区操作中的含义一致。
返回值说明:成功则返回统计需要删除的分区表数量,失败会报错。
对分区规则中的所有分区表创建和删除分区
在添加分区规则后,可以根据分区管理规则对所有分区主表执行删除和创建分区的操作。分区规则表pg_auto_partition_config
中的所有分区规则都可以通过pg_auto_partition_run
UDF操作,该操作既可以创建分区,也可以删除分区(删除旧分区,创建新分区),具体语法如下:
SELECT pg_auto_partition_run(real_drop);
参数说明:real_drop参数和对单个分区表删除分区操作中的含义一致。
返回值说明:成功则返回创建成功的分区表数和统计需要删除的分区表数,失败会报错。
对分区规则中的所有分区表统计需要创建的分区数
统计需要创建的分区数由pg_auto_partition_count_add_target
UDF操作,该UDF仅进行统计,不实际创建分区,具体语法如下:
SELECT pg_auto_partition_count_add_target(check_old);
参数说明如下。
参数 | 说明 |
check_old | 是否统计当前时间之前需要新增的分区,默认值为false。取值说明如下:
|
返回值说明:成功则返回根据分区规则所需要创建的新增分区数,失败会报错。
对分区规则中的所有分区表统计需要删除的分区数
统计根据分区规则所需要删除的分区数由pg_auto_partition_count_delete_target
UDF操作,该UDF仅进行统计,不实际删除分区,具体语法如下:
SELECT pg_auto_partition_count_delete_target();
返回值说明:成功则返回根据分区规则所需要删除的分区数,失败会报错。
删除分区规则
删除分区规则可以使用pg_auto_partition_unregister
UDF来操作,具体语法如下:
SELECT pg_auto_partition_unregister(part_schema, part_master);
参数说明:part_schema和part_master含义和增加分区规则中的含义一致。
返回值说明:成功则返回1,失败会报错。
配置自动化分区管理
自动化分区管理需要和pg_cron插件配合使用,只需要在完成创建分区规则后,将所有分区表的删除和创建的任务添加到定时任务即可。pg_cron的相关语法,请参见pg_cron。配置自动化分区管理具体语法如下:
SELECT cron.schedule('0 18 * * *', 'SELECT pg_auto_partition_run(true)');
配置自动化分区管理时,需要确保创建定时任务的数据库账号具有相关分区表的创建和删除权限。
分区表创建示例
步骤一:创建分区表的主表
CREATE TABLE t1(row_id int,
record_date timestamp,
primary key(row_id, record_date)
) partition BY range(record_date)
(DEFAULT PARTITION others);
步骤二:添加分区规则
SELECT pg_auto_partition_register('public', 't1', 'record_date','day', 5, 5);
步骤三:根据分区规则手动创建所有分区
SELECT pg_auto_partition_run(false);
步骤四:配置自动化分区管理
SELECT cron.schedule('0 18 * * *', 'SELECT pg_auto_partition_run(true)');