帮你快速理解、总结文档立即下载

pg_partman

最近更新时间:2026-09-16 11:44:01
我的收藏
本文为您介绍 pg_partman 插件的简介及使用方法。

概述

pg_partman 是分区管理插件,用于自动化管理 PostgreSQL 原生分区表,支持按时间或 ID 自动创建分区、自动路由数据、自动维护分区。

支持版本

PostgreSQL 版本
内核版本
PostgreSQL 11
v11.22_r1.35及以上
PostgreSQL 12
v12.22_r1.37及以上
PostgreSQL 13
v13.22_r1.32及以上
PostgreSQL 14
v14.22_r1.42及以上
PostgreSQL 15
v15.14_r1.27及以上
PostgreSQL 16
v16.10_r1.22及以上
PostgreSQL 17
v17.9_r1.16及以上
PostgreSQL 18
v18.3_r1.6及以上
说明:
您可在控制台实例详情页查看当前实例的内核版本,或执行 SHOW tencentdb_version; 查询。

插件简介

pg_partman 在 PostgreSQL 原生分区的基础上提供分区管理能力:创建分区父表后,pg_partman 会自动预创建未来分区、自动清理过期分区,并在后台定期执行维护,减少手动管理分区的工作量。

环境准备

在目标数据库中执行以下语句创建扩展:
postgres=> CREATE EXTENSION pg_partman;
CREATE EXTENSION
说明:
本插件的函数创建在 public 模式下,可直接调用。

创建时间分区表

创建原生分区表

先创建一张按时间范围分区的原生分区表:
postgres=> CREATE TABLE events (
id bigint,
event_time timestamptz NOT NULL,
data text
) PARTITION BY RANGE (event_time);
CREATE TABLE

配置分区策略

使用 create_parent 函数将分区表交由 pg_partman 管理,指定按天(daily)分区:
postgres=> SELECT create_parent('public.events', 'event_time', 'native', 'daily');
create_parent
---------------
t
(1 row)
create_parent 主要参数说明:
参数
说明
第一个参数
父表名(含 schema)
第二个参数
分区键列名
第三个参数
分区类型,native 表示原生分区
第四个参数
分区间隔,如 dailyhourlymonthly
返回 t 表示配置成功。pg_partman 会自动按当前时间预创建若干分区。

查看分区

使用 show_partitions 函数查看父表下的所有分区:
postgres=> SELECT show_partitions('public.events');
show_partitions
-----------------------------
(public,events_p2026_08_30)
(public,events_p2026_08_31)
(public,events_p2026_09_01)
(public,events_p2026_09_02)
(public,events_p2026_09_03)
(public,events_p2026_09_04)
(public,events_p2026_09_05)
(public,events_p2026_09_06)
(public,events_p2026_09_07)
(9 rows)

数据写入

向父表插入数据时,PostgreSQL 会根据分区键自动路由到对应的子分区:
postgres=> INSERT INTO events VALUES (1, now(), 'a'), (2, now(), 'b');
INSERT 0 2
postgres=> SELECT tableoid::regclass AS partition, count(*) FROM events GROUP BY partition ORDER BY partition;
partition | count
--------------------+-------
events_p2026_09_03 | 2
(1 row)
说明:
两条数据被自动写入 events_p2026_09_03 分区,即当前日期对应的分区。

查看分区配置

part_config 表记录了 pg_partman 管理的分区表配置:
postgres=> SELECT parent_table, partition_type, partition_interval, premake FROM part_config;
parent_table | partition_type | partition_interval | premake
---------------+----------------+--------------------+---------
public.events | native | 1 day | 4
(1 row)
字段
说明
parent_table
父表名
partition_type
分区类型,native 表示原生分区
partition_interval
分区间隔
premake
预创建的未来分区数量

分区维护

使用 run_maintenance 函数执行分区维护,自动创建新的未来分区并清理过期分区:
postgres=> SELECT run_maintenance();
run_maintenance
-----------------

(1 row)
说明:
run_maintenance 是函数,使用 SELECT 调用。在生产环境中,pg_partman 会通过后台进程定期自动执行维护,通常无需手动调用。

创建 ID 分区表

对于按 ID 递增的场景,可使用 ID 分区。以下示例按每1000个 ID 一个分区:
postgres=> CREATE TABLE orders (
order_id bigint NOT NULL,
order_time timestamptz,
amount numeric
) PARTITION BY RANGE (order_id);
CREATE TABLE
postgres=> SELECT create_parent('public.orders', 'order_id', 'native', '1000');
create_parent
---------------
t
(1 row)
postgres=> SELECT show_partitions('public.orders');
show_partitions
-----------------------
(public,orders_p0)
(public,orders_p1000)
(public,orders_p2000)
(public,orders_p3000)
(public,orders_p4000)
(5 rows)
说明:
ID 分区的第四个参数为每个分区的 ID 区间大小,上例按每1000个 ID 划分一个分区。

常见问题

Q:create_parent 返回 t 后,为什么没有立即看到分区?

A:pg_partman 会按当前时间自动预创建分区,正常情况下会立即创建。您可使用 show_partitions 函数查看分区列表;若列表为空,请确认传入的分区键列名与类型是否正确。

Q:如何删除 pg_partman 管理的分区表?

A:直接对父表执行 DROP TABLE 会级联删除其所有分区,随后可在 part_config 表中清理对应的残留配置记录。

相关参考