2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18)
开发版本: devel

19.10. Vacuuming #

这些参数控制 vacuuming 的行为。有关 vacuum 的目的和职责的更多信息,请参阅 第 24.1 节

19.10.1. 自动 Vacuuming #

这些设置控制 autovacuum 功能的行为。有关更多信息,请参阅 第 24.1.6 节。请注意,这些设置中的许多都可以按表进行覆盖;请参阅 存储参数

autovacuum (boolean) #

控制服务器是否应运行 autovacuum 启动器守护进程。默认情况下此选项为开启状态;但是,要使 autovacuum 工作,还必须启用 track_counts。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但是,可以通过更改表存储参数为单个表禁用 autovacuuming。

请注意,即使此参数被禁用,系统仍会在必要时启动 autovacuum 进程以防止事务 ID 回绕。有关更多信息,请参阅 第 24.1.5 节

autovacuum_worker_slots (integer) #

指定为 autovacuum 工作进程保留的后端槽数。默认通常是 16 个槽,但如果您的内核设置不支持(如 initdb 期间确定的),则可能少于此数。此参数只能在服务器启动时设置。

更改此值时,请考虑也调整 autovacuum_max_workers

autovacuum_max_workers (integer) #

指定在任何给定时间内可能运行的 autovacuum 进程(除了 autovacuum 启动器)的最大数量。默认值为 3。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

请注意,如果此值的设置高于 autovacuum_worker_slots,则不会产生任何效果,因为 autovacuum 工作进程是从该设置建立的槽位池中获取的。

autovacuum_naptime (integer) #

指定 autovacuum 在任何给定数据库上运行之间的最短延迟。在每一轮中,守护进程会检查数据库,并为该数据库中的表发出所需的 VACUUMANALYZE 命令。如果此值不带单位指定,则将其视为秒。默认值为一分钟(1min)。此参数只能在 postgresql.conf 文件或服务器命令行中设置。

autovacuum_vacuum_threshold (integer) #

指定在任何一个表中触发 VACUUM 所需的已更新或已删除元组的最小数量。默认值为 50 个元组。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但是可以通过更改表存储参数为单个表覆盖此设置。

autovacuum_vacuum_insert_threshold (integer) #

指定在任何一个表中触发 VACUUM 所需的已插入元组的数量。默认值为 1000 个元组。如果指定 -1,autovacuum 将不会根据插入的数量触发任何表的 VACUUM 操作。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但是可以通过更改表存储参数为单个表覆盖此设置。

autovacuum_analyze_threshold (integer) #

指定在任何一个表中触发 ANALYZE 所需的已插入、已更新或已删除元组的最小数量。默认值为 50 个元组。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但是可以通过更改表存储参数为单个表覆盖此设置。

autovacuum_vacuum_scale_factor (floating point) #

指定在决定是否触发 VACUUM 时添加到 autovacuum_vacuum_threshold 的表大小的比例。默认值为 0.2(表大小的 20%)。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但是可以通过更改表存储参数为单个表覆盖此设置。

autovacuum_vacuum_insert_scale_factor (floating point) #

指定在决定是否触发 VACUUM 时添加到 autovacuum_vacuum_insert_threshold 的表中未冻结页面的比例。默认值为 0.2(表中未冻结页面的 20%)。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但是可以通过更改表存储参数为单个表覆盖此设置。

autovacuum_analyze_scale_factor (floating point) #

指定在决定是否触发 ANALYZE 时添加到 autovacuum_analyze_threshold 的表大小的比例。默认值为 0.1(表大小的 10%)。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但是可以通过更改表存储参数为单个表覆盖此设置。

autovacuum_vacuum_max_threshold (integer) #

指定在任何一个表中触发 VACUUM 所需的已更新或已删除元组的最大数量,即对通过 autovacuum_vacuum_thresholdautovacuum_vacuum_scale_factor 计算出的值设置上限。默认值为 100,000,000 个元组。如果指定 -1,autovacuum 将不会强制执行触发 VACUUM 操作的已更新或已删除元组的最大数量。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但是可以通过更改存储参数为单个表覆盖此设置。

autovacuum_freeze_max_age (integer) #

指定表的 pg_class.relfrozenxid 字段在强制执行 VACUUM 操作以防止表内事务 ID 回绕之前可以达到的最大年龄(以事务计数)。请注意,即使 autovacuum 通常被禁用,系统仍会启动 autovacuum 进程来防止回绕。

Vacuum 还可以删除 pg_xact 子目录中的旧文件,因此默认值为相对较低的 2 亿事务。此参数只能在服务器启动时设置,但可以通过更改表存储参数为单个表降低此设置。有关更多信息,请参阅 第 24.1.5 节

autovacuum_multixact_freeze_max_age (integer) #

指定表的 pg_class.relminmxid 字段在强制执行 VACUUM 操作以防止表内多事务 ID 回绕之前可以达到的最大年龄(以多事务计数)。请注意,即使 autovacuum 通常被禁用,系统仍会启动 autovacuum 进程来防止回绕。

Vacuuming multixacts 还可以删除 pg_multixact/memberspg_multixact/offsets 子目录中的旧文件,因此默认值为相对较低的 4 亿多事务。此参数只能在服务器启动时设置,但可以通过更改表存储参数为单个表降低此设置。有关更多信息,请参阅 第 24.1.5.1 节

autovacuum_vacuum_cost_delay (floating point) #

指定在自动 VACUUM 操作中使用的成本延迟值。如果指定 -1,则将使用常规的 vacuum_cost_delay 值。如果此值不带单位指定,则将其视为毫秒。默认值为 2 毫秒。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但是可以通过更改表存储参数为单个表覆盖此设置。

autovacuum_vacuum_cost_limit (integer) #

指定在自动 VACUUM 操作中使用的成本限制值。如果指定 -1(这是默认值),则将使用常规的 vacuum_cost_limit 值。请注意,如果运行的 autovacuum 工作进程不止一个,则该值会按比例分配给它们,以便每个工作进程的限制之和不超过此变量的值。此参数只能在 postgresql.conf 文件或服务器命令行中设置;但是可以通过更改表存储参数为单个表覆盖此设置。

19.10.2. 基于成本的 Vacuum 延迟 #

在执行 VACUUMANALYZE 命令期间,系统会维护一个内部计数器,该计数器会跟踪执行的各种 I/O 操作的估计成本。当累积成本达到限制(由 vacuum_cost_limit 指定)时,执行操作的进程将根据 vacuum_cost_delay 指定的短时间休眠。然后,它将重置计数器并继续执行。

此功能旨在允许管理员降低这些命令对并发数据库活动的 I/O 影响。在许多情况下,VACUUMANALYZE 等维护命令不必快速完成;然而,通常非常重要的是这些命令不会显著干扰系统执行其他数据库操作的能力。基于成本的 vacuum 延迟为管理员提供了一种实现此目的的方法。

默认情况下,此功能对手动发出的 VACUUM 命令是禁用的。要启用它,请将 vacuum_cost_delay 变量设置为非零值。

vacuum_cost_delay (floating point) #

当成本限制超过时,进程将休眠的时间量。如果此值不带单位指定,则将其视为毫秒。默认值为 0,表示禁用基于成本的 vacuum 延迟功能。正值会启用基于成本的 vacuuming。

使用基于成本的 vacuuming 时,vacuum_cost_delay 的适当值通常非常小,可能小于 1 毫秒。虽然 vacuum_cost_delay 可以设置为小数毫秒值,但在较旧的平台上可能无法准确测量这种延迟。在这些平台上,将 VACUUM 的节流资源消耗提高到 1 毫秒以上的水平需要更改其他 vacuum 成本参数。尽管如此,您仍应将 vacuum_cost_delay 设置为您平台能够一致测量的尽可能小的值;过大的延迟没有帮助。

vacuum_cost_page_hit (integer) #

vacuuming 共享缓冲区缓存中找到的缓冲区的估计成本。它表示锁定缓冲区池、查找共享哈希表和扫描页面内容的成本。默认值为 1

vacuum_cost_page_miss (integer) #

从磁盘读取的缓冲区的 vacuuming 估计成本。这代表了锁定缓冲区池、查找共享哈希表、从磁盘读取所需块并扫描其内容的工作量。默认值为 2

vacuum_cost_page_dirty (integer) #

vacuum 修改先前是干净的块时收取的估计成本。它表示将脏块写回磁盘所需的额外 I/O。默认值为 20

vacuum_cost_limit (integer) #

这是导致 vacuuming 进程休眠 vacuum_cost_delay 的累积成本。默认值为 200

注意

某些操作会持有关键锁,因此应尽快完成。在这些操作期间不会发生基于成本的 vacuum 延迟。因此,累积的成本可能远高于指定的限制。为避免在这种情况下出现不必要的长延迟,实际延迟的计算方法是 vacuum_cost_delay * accumulated_balance / vacuum_cost_limit,最大值为 vacuum_cost_delay * 4。

19.10.3. 默认行为 #

vacuum_truncate (boolean) #

启用或禁用 vacuum 尝试截断表末尾的任何空页。默认值为 true。如果为 true,则 VACUUM 和 autovacuum 会执行截断,并且截断页面的磁盘空间将返回给操作系统。请注意,截断需要对表进行 ACCESS EXCLUSIVE 锁。如果指定了 VACUUMTRUNCATE 参数,它将覆盖此参数的值。通过更改表存储参数也可以为单个表覆盖此设置。

19.10.4. 冻结 (Freezing) #

为了在事务 ID 回绕后仍能保持正确性,PostgreSQL 会将足够旧的行标记为冻结。这些行对所有人可见;其他事务不需要检查其插入 XID 来确定可见性。VACUUM 负责将行标记为冻结。以下设置控制 VACUUM 的冻结行为,应根据系统的 XID 消耗率和主要工作负载的数据访问模式进行调整。有关事务 ID 回绕和调整这些参数的更多信息,请参阅 第 24.1.5 节

vacuum_freeze_table_age (integer) #

如果表的 pg_class.relfrozenxid 字段的年龄达到此设置指定的年龄,VACUUM 将执行一次积极扫描。积极扫描与常规 VACUUM 不同,它会访问可能包含未冻结 XID 或 MXID 的每一页,而不仅仅是可能包含死元组的页面。默认值为 1.5 亿事务。虽然用户可以将此值设置为零到二十亿之间的任何值,但 VACUUM 会默默地将有效值限制为 autovacuum_freeze_max_age 的 95%,以便周期性手动 VACUUM 有机会在为表启动反回绕 autovacuum 之前运行。有关更多信息,请参阅 第 24.1.5 节

vacuum_freeze_min_age (integer) #

指定 VACUUM 用于决定何时触发冻结具有较旧 XID 的页面的截止年龄(以事务计数)。默认值为 5000 万事务。虽然用户可以将此值设置为零到十亿之间的任何值,但 VACUUM 会默默地将有效值限制为 autovacuum_freeze_max_age 值的一半,以便强制 autovacuums 之间不会有不合理短的时间间隔。有关更多信息,请参阅 第 24.1.5 节

vacuum_failsafe_age (integer) #

指定表的 pg_class.relfrozenxid 字段在 VACUUM 采取特别措施以避免系统范围的事务 ID 回绕失败之前可以达到的最大年龄(以事务计数)。这是 VACUUM 的最后手段策略。通常,当防止事务 ID 回绕的 autovacuum 已经运行一段时间后,该保护措施才会触发,尽管该保护措施可能在任何 VACUUM 期间触发。

当保护措施触发时,将不再应用任何有效的成本延迟,并将跳过进一步的非关键维护任务(如索引 vacuuming),并且正在使用的任何 缓冲区访问策略 都将被禁用,从而使 VACUUM 可以自由使用所有 共享缓冲区

默认值为 16 亿事务。虽然用户可以将此值设置为零到 21 亿之间的任何值,但 VACUUM 会默默地将有效值调整为不小于 autovacuum_freeze_max_age 的 105%。

vacuum_multixact_freeze_table_age (integer) #

如果表的 pg_class.relminmxid 字段的年龄达到此设置指定的年龄,VACUUM 将执行一次积极扫描。积极扫描与常规 VACUUM 不同,它会访问可能包含未冻结 XID 或 MXID 的每一页,而不仅仅是可能包含死元组的页面。默认值为 1.5 亿多事务。虽然用户可以将此值设置为零到二十亿之间的任何值,但 VACUUM 会默默地将有效值限制为 autovacuum_multixact_freeze_max_age 的 95%,以便周期性手动 VACUUM 有机会在为表启动反回绕之前运行。有关更多信息,请参阅 第 24.1.5.1 节

vacuum_multixact_freeze_min_age (integer) #

指定 VACUUM 用于决定何时触发冻结具有较旧多事务 ID 的页面的截止年龄(以多事务计数)。默认值为 500 万多事务。虽然用户可以将此值设置为零到十亿之间的任何值,但 VACUUM 会默默地将有效值限制为 autovacuum_multixact_freeze_max_age 值的一半,以便强制 autovacuums 之间不会有不合理短的时间间隔。有关更多信息,请参阅 第 24.1.5.1 节

vacuum_multixact_failsafe_age (integer) #

指定表的 pg_class.relminmxid 字段在 VACUUM 采取特别措施以避免系统范围的多事务 ID 回绕失败之前可以达到的最大年龄(以多事务计数)。这是 VACUUM 的最后手段策略。通常,当防止事务 ID 回绕的 autovacuum 已经运行一段时间后,该保护措施才会触发,尽管该保护措施可能在任何 VACUUM 期间触发。

当保护措施触发时,将不再应用任何有效的成本延迟,并且将跳过进一步的非关键维护任务(如索引 vacuuming)。

默认值为 16 亿多事务。虽然用户可以将此值设置为零到 21 亿之间的任何值,但 VACUUM 会默默地将有效值调整为不小于 autovacuum_multixact_freeze_max_age 的 105%。

vacuum_max_eager_freeze_failure_rate (floating point) #

指定 VACUUM 可以扫描并未能在可见性映射中设置所有冻结的页面数量(占关系总页面的比例),之后将禁用积极扫描。值为 0 表示完全禁用积极扫描。默认值为 0.03(3%)。

请注意,当启用积极扫描时,只有冻结失败才会计入上限,成功的冻结不计。成功的页面冻结在内部被限制为关系中所有可见但未全部冻结的页面的 20%。对成功页面冻结设置上限有助于分摊多次常规 vacuum 的开销,并限制了在下次积极 vacuum 之前页面被再次修改的浪费性积极冻结的潜在负面影响。

此参数只能在 postgresql.conf 文件或服务器命令行中设置;但是可以通过更改相应的表存储参数为单个表覆盖此设置。有关调整 vacuum 冻结行为的更多信息,请参阅 第 24.1.5 节

提交更正

如果您在文档中发现任何不正确、与您实际使用该功能不符或需要进一步说明的内容,请使用 此表单 报告文档问题。