选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

文档 / 配置参数 / 资源消耗

CONFIGURATION PARAMETER资源消耗 / 内存

maintenance_work_mem

设置维护操作可使用的最大内存。

Sets the maximum memory to be used for maintenance operations.

整数 会话 引入 9.0(基线) 现存至 20 devel 1 次默认值变更

类型
整数integer
上下文
会话任何用户都可在会话内用 SET 修改
默认值
64 MiB原始值 65536 kB
取值范围
64 – 2147483647
引入版本
9.0(基线)
状态
现存

PostgreSQL 18 手册 官方文档

版本轨迹

相对 PostgreSQL 17 无变化。

默认值变迁

16 MiB 9.0 – 9.3 64 MiB 9.4 – 20

默认值一共换过 2 档,每段的宽度按它覆盖的大版本数伸展,深色的一段是当前查看的 PostgreSQL 18。带单位的取值换算成了可读形式,原始的 boot_val 与单位写在悬浮提示里。

手册说明

PostgreSQL 18 手册 · 19.4 资源消耗 本站手册 官方原文

指定维护操作(如 VACUUMCREATE INDEXALTER TABLE ADD FOREIGN KEY)可使用的最大内存量。 如果指定值时未带单位,则按千字节解释。默认值为 64 兆字节(64MB)。 由于数据库会话一次只能执行一个这样的操作,而一个安装通常也不会有很多此类操作并发运行, 因此把该值设置得明显大于 work_mem 通常是安全的。更大的设置可能改善清理和恢复数据库转储的性能。

注意当自动清理运行时,可能会分配最多达这个内存的autovacuum_max_workers倍,因此要小心不要把该默认值设置得太高。 通过独立地设置autovacuum_work_mem可能会对控制这种情况 有所帮助。

机制详解

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,多个工作进程的总预算会远高于单次维护操作的数值。

调优建议

按典型负载给出的取值思路,不是放之四海皆准的配方:实际取值要看数据量、并发度与硬件。

  • OLTP在线事务处理

    取值应足以让日常 vacuum 与索引维护高效完成,但必须显式预算多个 autovacuum worker 的并发。若交互延迟敏感且 maintenance_work_mem 很大,应为 autovacuum_work_mem 单独设置较低上限。

  • OLAP分析与批处理

    较大取值通常有利于大表索引构建、清理与恢复。应安排重型维护窗口,并验证维护并发、查询内存和操作系统内存仍能共同容纳。

  • 小规格低配实例与开发机

    全局值保持克制,只在受控维护会话中临时调高;增加之前先检查 autovacuum 的继承关系。

常见问题

  • 因为维护操作不频繁就认为大值无害,却让 autovacuum_work_mem 保持 -1。
  • 把上限按并行维护工作进程数相乘;PostgreSQL 对整个工具命令应用该上限。
  • 为了单次恢复长期保留很大的集群全局值,而不是使用作用域内 SET。
  • 期望单纯增加内存解决由锁或存储 I/O 主导的维护瓶颈。

演化历史

相邻两个大版本之间的差异,新的在前。版本号链到该版的快照。

  1. PostgreSQL 20 ← 19 沿用 19

    事实沿用 19

  2. PostgreSQL 17 ← 16 属性变更

    最小值 1024 64

  3. PostgreSQL 9.4 ← 9.3 默认值变更

    默认值 16 MiB 64 MiB

逐版本快照

每个收录版本里的 7 项事实,与上一个存在的版本不同的格子带底色。版本号链到该版。

版本 默认值单位上下文类型最小值最大值枚举值
9.0 16 MiB kB 会话 整数 1024 2147483647
9.1 16 MiB kB 会话 整数 1024 2147483647
9.2 16 MiB kB 会话 整数 1024 2147483647
9.3 16 MiB kB 会话 整数 1024 2147483647
9.4 64 MiB kB 会话 整数 1024 2147483647
9.5 64 MiB kB 会话 整数 1024 2147483647
9.6 64 MiB kB 会话 整数 1024 2147483647
10 64 MiB kB 会话 整数 1024 2147483647
11 64 MiB kB 会话 整数 1024 2147483647
12 64 MiB kB 会话 整数 1024 2147483647
13 64 MiB kB 会话 整数 1024 2147483647
14 64 MiB kB 会话 整数 1024 2147483647
15 64 MiB kB 会话 整数 1024 2147483647
16 64 MiB kB 会话 整数 1024 2147483647
17 64 MiB kB 会话 整数 64 2147483647
18 64 MiB kB 会话 整数 64 2147483647
19 64 MiB kB 会话 整数 64 2147483647
20 沿用 64 MiB kB 会话 整数 64 2147483647

参考资料

同类参数

参数 类型 上下文 默认值 版本变动 最近变更
Resource Usage 资源消耗 23 个
内存 23
autovacuum_work_mem 整数 重载生效 -1 kB
设置每个 autovacuum 工作进程可使用的最大内存。 现存
commit_timestamp_buffers 整数 重启生效 0 B (0 × 8kB)
设置提交时间戳缓存专用缓冲池的大小。 现存
dynamic_shared_memory_type 枚举 重启生效 posix 121 次
选择动态共享内存实现。 现存
hash_mem_multiplier 浮点 会话 2 151 次
以 work_mem 的倍数确定哈希表内存上限。 现存
huge_page_size 整数 重启生效 0 B
设置 PostgreSQL 请求的显式大页大小。 现存
huge_pages 枚举 重启生效 try
控制在 Linux 或 Windows 上使用大页。 现存
logical_decoding_work_mem 整数 会话 64 MiB
设置逻辑解码使用的最大内存。 现存
maintenance_work_mem 整数 会话 64 MiB 172 次
设置维护操作可使用的最大内存。 现存
max_prepared_transactions 整数 重启生效 0 9.62 次
设置可同时处于 prepared 状态的事务上限。 现存
max_stack_depth 整数 会话(超级用户) 100 KiB
设置 PostgreSQL 认为安全的最大执行栈深度。 现存
min_dynamic_shared_memory 整数 重启生效 0 B
设置启动时为并行查询预留的动态共享内存。 现存
multixact_member_buffers 整数 重启生效 256 KiB (32 × 8kB)
设置 MultiXact member 缓存专用缓冲池的大小。 现存
multixact_offset_buffers 整数 重启生效 128 KiB (16 × 8kB)
设置 MultiXact offset 缓存专用缓冲池的大小。 现存
notify_buffers 整数 重启生效 128 KiB (16 × 8kB)
设置 LISTEN/NOTIFY 消息缓存专用缓冲池的大小。 现存
replacement_sort_tuples 整数 会话 150000
设置使用替换选择排序的最大元组数。 于 11 移除
serializable_buffers 整数 重启生效 256 KiB (32 × 8kB)
设置可串行化事务缓存专用缓冲池的大小。 现存
shared_buffers 整数 重启生效 128 MiB (16384 × 8kB) 151 次
设置服务器使用的共享缓冲区数量。 现存
shared_memory_type 枚举 重启生效 mmap
选择主共享内存区域的实现。 现存
subtransaction_buffers 整数 重启生效 0 B (0 × 8kB)
设置子事务状态缓存专用缓冲池的大小。 现存
temp_buffers 整数 会话 8 MiB (1024 × 8kB)
设置每个会话使用的最大临时缓冲区内存。 现存
transaction_buffers 整数 重启生效 0 B (0 × 8kB)
设置事务状态缓存专用缓冲池的大小。 现存
vacuum_buffer_usage_limit 整数 会话 2 MiB 171 次
设置 VACUUM、ANALYZE 与 autovacuum 的缓冲区访问环大小。 现存
work_mem 整数 会话 4 MiB 9.41 次
设置查询工作区可使用的最大内存。 现存