autovacuum_vacuum_scale_factor
Fact — 官方简述译文:把表大小的一定比例加入触发 VACUUM 的元组变更阈值。
身份
生命周期
| Fact | 值 |
|---|---|
| 首次观测 | PG9.0(研究下界) |
| 在档版本 | PG9.0–19 Beta 3 |
| 移除版本 | 否 |
| 引入提交 | 不作断言:早于 PG9.0 研究边界 |
| 提交日期 | — |
| Discussion | — |
默认值变迁
| 版本 | 原始 boot_val |
单位 | 人类可读值 |
|---|---|---|---|
| PG9.0–19 Beta 3 | 0.2 |
— | 0.2 |
机制详解
核心触发值为基础阈值加上本参数乘以 pg_class.reltuples;后者是近似行数。PostgreSQL 18 还会用 autovacuum_vacuum_max_threshold 对结果封顶。
该触发器统计 UPDATE 或 DELETE 产生的旧元组;仅插入负载有独立的 insert threshold 与 scale factor。防回卷清理由事务年龄规则控制,不依赖本参数。
表级 autovacuum_vacuum_scale_factor storage parameter 会覆盖全局值。当不同表的大小和更新率差异很大时,表级设置通常更合适。
调优建议
Advice。 以下建议是工作负载起点,必须用真实测量验证。
| 场景 | 建议 |
|---|---|
| OLTP | 对大型高更新表使用更低的表级值,避免死元组形成巨大的绝对积压;应依据实际变更量与清理时长验证,而不是只看百分比。 |
| OLAP | 追加与批处理负载应让阈值配合装载周期及显式 VACUUM/ANALYZE;过低的全局值可能在批处理期间触发不必要维护。 |
| 小规格 | 真正的小表通常可使用上游默认值。优先逐表处理例外;过低的集群级值可能导致频繁而细碎的 vacuum。 |
Pigsty 取值
以下值来自固定 8 核、32 GiB、100 GiB SSD 夹具,并按 PG19 Beta 3 渲染当前 Pigsty 模板;这不表示 Pigsty 当前支持该历史或测试版本。
| 模板 | 有效值 | 与上游 boot 比较 | 源表达式 |
|---|---|---|---|
| OLTP | 0.08 |
不同于 boot 值 | 0.08 |
| OLAP | 0.08 |
不同于 boot 值 | 0.08 |
| CRIT | 0.08 |
不同于 boot 值 | 0.08 |
| TINY | 未修改 | — | — |
Advice — 待人工复核。 当前 Pigsty 模板投影事实:OLTP: PG9.0–19 Beta 3 = 0.08 (dcs);OLAP: PG9.0–19 Beta 3 = 0.08 (dcs);CRIT: PG9.0–19 Beta 3 = 0.08 (dcs);TINY: PG9.0–19 Beta 3 未修改。 建议(待人工复核)——编辑推断(待维护者复核):较大规格模板通过更早清理限制大表的绝对死元组积压,而 TINY 避免在受限资源上增加清理频率。
常见坑
- 看似很小的比例在大表上仍可能代表数百万死元组。
- 全局降低可能让大量表持续产生 I/O 压力。
- 它不控制仅插入触发的 vacuum,也不控制防回卷 vacuum。
- reltuples 是估算值,触发点不是精确的死元组比例。
- 表级 storage parameter 可能让该表忽略全局值。
关联参数
autovacuum_vacuum_threshold · autovacuum_vacuum_max_threshold · autovacuum_vacuum_insert_scale_factor · autovacuum_analyze_scale_factor · autovacuum_naptime · autovacuum_freeze_max_age
参考资料
- PostgreSQL 19 Beta 3 — autovacuum_vacuum_scale_factor
- PostgreSQL 18:Autovacuum 触发公式
- PostgreSQL 19 发行说明
- 机器可读 GUC 全量导出