CONFIGURATION PARAMETER清理 / 默认行为
vacuum_truncate
允许 VACUUM 截断表尾的空页面。
Enables vacuum to truncate empty pages at the end of the table.
布尔 会话 引入 18 现存至 20 devel 0 次默认值变更
版本轨迹
PostgreSQL 18 新增此参数。
默认值变迁
默认值自 PostgreSQL 18 起没有变过。带单位的取值换算成了可读形式,原始的 boot_val 与单位写在悬浮提示里。
手册说明
启用或禁用 vacuum 尝试截断表末尾的空页。默认值为true。 如果为true,则VACUUM和 autovacuum 会执行截断,并将这些页面占用的磁盘空间返还给操作系统。 请注意,截断需要获取表上的ACCESS EXCLUSIVE锁。 如果在VACUUM中指定了TRUNCATE参数,它将覆盖该参数的值。 也可以通过修改表存储参数来为单个表覆盖此设置。
机制详解
允许 VACUUM 截断表尾的空页面。它可在会话级修改,因此不同会话可能采用不同的行为。
它参与 VACUUM 的触发、节流或冻结决策;多数行为可被表级 storage parameter 覆盖。应结合 pg_stat_*、pg_class 年龄与真实维护日志判断,而不是只看全局值。
应把 vacuum_truncate 与 vacuum_max_eager_freeze_failure_rate、vacuum_freeze_table_age、autovacuum_freeze_max_age 一起监控和变更。先在对应角色与真实负载上验证,再按其 user context 选择会话修改、reload 或 restart;历史默认值并不等于当前有效值。
调优建议
按典型负载给出的取值思路,不是放之四海皆准的配方:实际取值要看数据量、并发度与硬件。
-
OLTP在线事务处理
根据表大小、变更速率与维护 SLA 调 vacuum_truncate,大表优先使用表级阈值;观察触发间隔、死元组和 ANALYZE/VACUUM 时长。
-
OLAP分析与批处理
批量装载后主动 ANALYZE/VACUUM,不要只等待比例阈值;对 append-only 分区单独规划冻结与 visibility map 推进。
-
小规格低配实例与开发机
先保持默认;小表固定阈值比比例项更重要,修改后确认 worker 数量和 I/O 仍有余量。
常见问题
- 误以为截断能删除关系中间的空页;只有连续空表尾可以移除。
- 忽略 ACCESS EXCLUSIVE 锁尝试及其在繁忙表上的阻塞延迟。
- 关闭截断后仍期待操作系统文件大小自动缩小。
- 忘记表级 vacuum_truncate storage parameter 可覆盖会话/全局值。
- 依赖 failsafe 期间截断空间;为尽快完成,VACUUM 可能跳过它。
演化历史
相邻两个大版本之间的差异,新的在前。版本号链到该版的快照。
-
PostgreSQL 20 ← 19 沿用 19
事实沿用 19
-
PostgreSQL 18 ← 17 新增此参数
PostgreSQL 18 起可用
逐版本快照
每个收录版本里的 7 项事实,与上一个存在的版本不同的格子带底色。版本号链到该版。
参考资料
同类参数
| 参数 | 类型 | 上下文 | 默认值 | 版本变动 | 最近变更 |
|---|---|---|---|---|---|
| 默认行为 1 | |||||
vacuum_truncate |
布尔 | 会话 | on |
— | |
| 允许 VACUUM 截断表尾的空页面。 | 现存 | ||||