只扫描正确的切片
分区按键把逻辑表拆成物理片段,通常是日期范围。裁剪让拆分有用:规划器读取分区边界,排除不可能包含匹配行的片段。按月分区表上查询 created_at >= '2026-10-01' AND created_at < '2026-11-01' 应该只访问一个分区。
CREATE TABLE events (
id bigint GENERATED ALWAYS AS IDENTITY,
created_at timestamptz NOT NULL,
payload jsonb NOT NULL
) PARTITION BY RANGE (created_at);
CREATE TABLE events_2026_10 PARTITION OF events
FOR VALUES FROM ('2026-10-01') TO ('2026-11-01');
用 EXPLAIN 验证裁剪:计划应只列出相关分区。如果列出全部,说明条件不可 sargable、过滤条件缺少分区键,或参数类型阻止了计划期求值。EXPLAIN (ANALYZE, BUFFERS) 能看到实际读取量并确认差异。
保持条件干净
WHERE date_trunc('day', created_at) = '2026-10-15' 在分区键上应用函数,可能破坏裁剪。改写成范围:created_at >= '2026-10-15' AND created_at < '2026-10-16'。对列做类型转换或与不兼容类型比较也一样。sargable 条件同时有利于裁剪和索引。
运行时裁剪能处理参数值在执行时才确定的查询,但无法替代好的键和干净条件。用代表性参数检查计划,而不只是字面量。
保留与运维
分区让保留变便宜:分离并删除旧分区,而不是逐行删除。这样避免膨胀和长事务,但这是破坏性操作,需要备份、依赖检查和副本协调。提前创建未来分区;缺失分区会导致插入失败或落入默认分区。监控分区数量和大小;成千上万的小分区会增加规划时间和目录开销。
何时使用
当大表有自然范围键、查询集中在近期切片,并且保留或维护能从分区级操作受益时,使用分区。优点是减少 I/O 和简化保留;缺点是规划复杂、分区管理,以及跨多分区的查询。与单纯索引相比,分区还缩小了维护和删除的物理范围,但不能替代选择性索引。