maintenance_work_mem
Fact — 官方简述译文:设置维护操作可使用的最大内存。
身份
生命周期
| Fact | 值 |
|---|---|
| 首次观测 | PG9.0(研究下界) |
| 在档版本 | PG9.0–19 Beta 3 |
| 移除版本 | 否 |
| 引入提交 | 不作断言:早于 PG9.0 研究边界 |
| 提交日期 | — |
| Discussion | — |
默认值变迁
| 版本 | 原始 boot_val |
单位 | 人类可读值 |
|---|---|---|---|
| PG9.0–9.3 | 16384 |
kB |
16 MiB |
| PG9.4–19 Beta 3 | 65536 |
kB |
64 MiB |
机制详解
maintenance_work_mem 用于 VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY 等维护操作。一个会话通常同一时间只执行一个此类操作,因此它一般可以显著高于 work_mem。
对于并行工具命令,PostgreSQL 将 maintenance_work_mem 视为整个工具命令的上限,而不是给每个并行维护工作进程完整分配一份;不过并行度仍可能显著增加 CPU 与 I/O 消耗。
Autovacuum 是另一项并发风险:当 autovacuum_work_mem 为 -1 时,每个 autovacuum 工作进程都会继承 maintenance_work_mem,多个工作进程的总预算会远高于单次维护操作的数值。
调优建议
Advice。 以下建议是工作负载起点,必须用真实测量验证。
| 场景 | 建议 |
|---|---|
| OLTP | 取值应足以让日常 vacuum 与索引维护高效完成,但必须显式预算多个 autovacuum worker 的并发。若交互延迟敏感且 maintenance_work_mem 很大,应为 autovacuum_work_mem 单独设置较低上限。 |
| OLAP | 较大取值通常有利于大表索引构建、清理与恢复。应安排重型维护窗口,并验证维护并发、查询内存和操作系统内存仍能共同容纳。 |
| 小规格 | 全局值保持克制,只在受控维护会话中临时调高;增加之前先检查 autovacuum 的继承关系。 |
Pigsty 取值
以下值来自固定 8 核、32 GiB、100 GiB SSD 夹具,并按 PG19 Beta 3 渲染当前 Pigsty 模板;这不表示 Pigsty 当前支持该历史或测试版本。
| 模板 | 有效值 | 与上游 boot 比较 | 源表达式 |
|---|---|---|---|
| OLTP | 2048MB |
不同于 boot 值 | {{ pg_maintenance_mem }}MB |
| OLAP | 4096MB |
不同于 boot 值 | {{ pg_maintenance_mem }}MB |
| CRIT | 2048MB |
不同于 boot 值 | {{ pg_maintenance_mem }}MB |
| TINY | 2048MB |
不同于 boot 值 | {{ pg_maintenance_mem }}MB |
Advice — 待人工复核。 当前 Pigsty 模板投影事实:OLTP: PG9.0–19 Beta 3 = 2048MB (dcs);OLAP: PG9.0–19 Beta 3 = 4096MB (dcs);CRIT: PG9.0–19 Beta 3 = 2048MB (dcs);TINY: PG9.0–19 Beta 3 = 2048MB (dcs)。 建议(待人工复核)——编辑推断:更高的 OLAP 比例意在加速批量维护,而被 autovacuum 继承后的并发风险需要单独复核。
常见坑
- 因为维护操作不频繁就认为大值无害,却让 autovacuum_work_mem 保持 -1。
- 把上限按并行维护工作进程数相乘;PostgreSQL 对整个工具命令应用该上限。
- 为了单次恢复长期保留很大的集群全局值,而不是使用作用域内 SET。
- 期望单纯增加内存解决由锁或存储 I/O 主导的维护瓶颈。
关联参数
autovacuum_work_mem · autovacuum_max_workers · max_parallel_maintenance_workers · vacuum_buffer_usage_limit · work_mem
参考资料
- PostgreSQL 19 Beta 3 — maintenance_work_mem
- PostgreSQL 18:日常清理
- Pigsty:参数优化策略
- PostgreSQL 19 发行说明
- 机器可读 GUC 全量导出