SuperAPI AI 工具集

postgres-impl-partitioning

数据与分析

查看项目

更新于 10-15 22:18

技能介绍

用途:将一张逻辑大表按分区键拆成多张物理子表,使规划器跳过不可能命中行的子分区(分区裁剪),从而避免全表扫描,并支持按分区批量下线与归档旧数据。

主要能力:三种策略——RANGE 适合时间序列或顺序 id,边界下含上不含;LIST 适合地区、租户、状态等离散集合;HASH 用模数与余数实现均匀分布。可添加 DEFAULT 分区兜底未覆盖的值。提供分区裁剪判断、ATTACH 分区时用匹配 CHECK 跳过校验扫描、父表索引与唯一约束规则、DETACH PARTITION CONCURRENTLY 以及 pg_partman 自动化与保留策略。

必要用法:查询必须始终在 WHERE 中过滤分区键,否则每个分区都会被扫描;UNIQUE / PRIMARY KEY 必须包含全部分区键列,否则 PostgreSQL 拒绝创建。RANGE 示例:CREATE TABLE measurement (...) PARTITION BY RANGE (logdate); CREATE TABLE measurement_2026m01 PARTITION OF measurement FOR VALUES FROM ('2026-01-01') TO ('2026-02-01'); 加载已有数据时应先建独立表并加匹配 CHECK,再 ATTACH PARTITION,之后删除该 CHECK。滚动时间窗口可用 CREATE EXTENSION pg_partman SCHEMA partman; 配合 partman.create_parent、part_config 保留设置与 CALL partman.run_maintenance_proc() 维护。

适用场景:表大到全表扫描或 VACUUM 过慢;数据存在自然的时间、序列或类别维度;需要整块删除或归档旧数据;查询意外扫描所有分区需要恢复裁剪;需要自动滚动时间窗口分区与保留。

限制:分区仅限单实例,不用于跨服务器分片;小表分区只会增加规划开销;不能替代索引;若查询很少按某列过滤,按该列分区无法触发裁剪;父表不支持 CREATE INDEX CONCURRENTLY,需按分区并发建索引再 ATTACH;pg_partman 5.x 仅支持声明式分区且要求 PostgreSQL 14 及以上;无 DEFAULT 分区时无匹配行会报 SQLSTATE 23514。具体版本行为与完整 API 细节暂未提供。