声明式分区 是一种用于将表划分为分区的分区方法
声明式分区 自 PostgreSQL 10 起可用。
概述
传统上,PostgreSQL 通过继承分区提供分区功能,该功能利用了 PostgreSQL 的表继承能力。然而,这种方法存在一些限制;特别是设置和维护过程要手动得多。
声明式分区,顾名思义,提供了一种显式声明带有分区的表的方式,目前提供了以下分区方法:
范围分区列表分区哈希分区(PostgreSQL 11 及更高版本)
使用 声明式分区 创建的分区表由顶层的 分区表 和一个或多个分区组成,这些分区可以是普通表或 外表。
配置
以下 配置参数 会影响 声明式分区 的使用
系统函数
以下系统函数与 声明式分区 的使用有关
变更历史
- PostgreSQL 18
- PostgreSQL 17
- PostgreSQL 16
- 批量插入和更新效率更高(提交 3592e0ff)
- PostgreSQL 15
- PostgreSQL 14
- 可以使用
ALTER TABLE ... DETACH PARTITION ... CONCURRENTLY来并发分离分区(提交 71f4c8c6) - 为
REINDEX添加了对分区表和索引的支持(提交 a6642b3a) - postgres_fdw:现在可以导入
IMPORT FOREIGN SCHEMA ... LIMIT子句中指定的分区(提交 a3740c48)
- 可以使用
- PostgreSQL 13
- 现在可以使用
ROW表达式定义分区(提交 bb4114a4) - 扩展了可以应用分区修剪的用例范围(提交 4e85642d)
- 扩展了可以应用分区间连接的用例范围(提交 c8434d64 和 981643dc)
- 允许在 分区表 上使用
BEFORE行级触发器(提交 487e9861) - 分区表 可以通过 发布 进行逻辑复制(提交 17b9e7f9 和 83fd4532)
- 分区表 现在可以作为 逻辑复制 中的复制目标(提交 f1ac27bf)
- 向
CREATE PUBLICATION添加了参数publish_via_partition_root(提交 83fd4532) - 添加了
pgbench选项--partitions和--partition-method(提交 b1c1aa53)
- 现在可以使用
- PostgreSQL 12
- PostgreSQL 11
- 添加了对默认分区的支持(提交 6f6b99d1)
- 分区修剪能够处理任何稳定的表达式(提交 73b7f48f)
- 添加了在执行时进行分区修剪的支持(提交 499be013)
- 添加了哈希分区支持(提交 1aba8e65)
- 现在
UPDATE` 可以将行在分区之间移动(初始提交 2f178441) - 允许在分区表上创建唯一索引(提交 eb7ed3f3)
- 允许在分区表上使用
INSERT ... ON CONFLICT ...(提交 555ee77a) - 允许在分区表上使用 外键(提交 3de241db)
- 允许在分区表上使用
FOR EACH ROW触发器(提交 86f57594) - 对 分区表 进行
INSERT、UPDATE和COPY操作可以将行路由到外部分区(提交 3d956d95) - 启用了分区间连接(提交 f49842d1)
- 启用了分区间分组/聚合(提交 e2f1eb0e)
- PostgreSQL 10
- 已添加(初始提交 f0e44751)
参考资料
- PostgreSQL documentation: Declarative Partitioning
有用链接
- Postgres Partition: Upgrade your Partitioning from Inheritance to Declarative - August 2023 blog article by Ashutosh Bapat / EnterpriseDB
