表分区
PostgreSQL 中的表分区是什么?
分区按范围、列表或哈希将一张逻辑表拆分为多个较小的物理表,使查询和维护只涉及所需的分区。
使用声明式分区时,先用 PARTITION BY 创建分区表,再添加分区,每个分区存放一个键范围、一组值列表或一个哈希桶。应用程序读写父表,PostgreSQL 会将每一行路由到正确的分区。
分区裁剪让规划器可以跳过不可能匹配查询 WHERE 子句的分区。分区还让清理旧数据变得代价很低:删除或分离一个分区比逐行删除其中的数据快得多。这些好处通常只在原本会非常大的表上才能体现出来。
示例
该示例按月创建范围分区,并让 EXPLAIN 分析查询 11 月数据的语句。输出中只出现 measurements_2026_11,因为分区裁剪跳过了 10 月的分区。
CREATE TABLE measurements (
taken_on date NOT NULL,
value numeric
) PARTITION BY RANGE (taken_on);
CREATE TABLE measurements_2026_10 PARTITION OF measurements
FOR VALUES FROM ('2026-10-01') TO ('2026-11-01');
CREATE TABLE measurements_2026_11 PARTITION OF measurements
FOR VALUES FROM ('2026-11-01') TO ('2026-12-01');
INSERT INTO measurements VALUES ('2026-10-15', 1.5), ('2026-11-02', 2.5);
EXPLAIN SELECT * FROM measurements WHERE taken_on >= '2026-11-01';适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。
参考资料
PostgreSQL 官方文档(英文)。