PostgreSQL 19 前瞻:Autovacuum 机制调整

优化PostgreSQL Autovacuum 作者:Laurenz Albe是CYBERTEC的高级顾问和支持工程师。自2006年以来,他一直在PostgreSQL上工作并为PostgreSQL做贡献。 译者:类延良,任职于瀚高基础软件股份有限公司,PostgreSQL数据库技术爱好者,10g &11g OCM,OGG认证专家。 在许多PostgreSQL数据库中,您无需考虑或担心调整autovacuum。它会在后台自动运行,并在不妨碍您的情况下进行清理。 但是有时默认配置还不够好,您必须调整autovacuum以使其正常工作。本文介绍了一些典 阅读详情

自 8.1 版本起,Autovacuum 机制便持续为 PostgreSQL 数据表提供运维保障,后续每个版本都对其进行了细节优化,包括更智能的阈值、插入感知触发策略、资源开销限制等。作为数据库核心运维工具,Autovacuum 能够有效规避事务ID回卷问题,持续更新数据表统计信息。本文将详细介绍 Postgres 19 在 Autovacuum 机制上的全新优化内容。

在过往的绝大多数版本中,Autovacuum 工作进程会先梳理出需要运维的数据表,再按照 pg_class 系统目录中的顺序依次处理。该调度逻辑完全均等化,不会区分任务紧急程度:一张即将触发事务ID回卷停机的表,和仅轻微超出统计更新阈值的普通表,会被同等调度处理,系统无法区分运维任务的优先级差异。

基于这一痛点,Postgres 19 对 Autovacuum 调度机制进行核心改造,实现运维任务的分级处理,让系统可以精准区分常规运维与紧急修复任务,同时支持管理员自主定义集群运维侧重性,无需重构整体调度逻辑。

优先级评分机制正式落地

本次优化的核心是全新的优先级评分体系。Autovacuum 启动运维任务前,会先为所有数据表计算优先级分数。调度进程会优先筛选存在事务ID、多事务ID回卷风险的数据库,其次选择长期未执行运维的数据库;在目标数据库内,系统不再依据目录顺序排序,而是根据数据表的量化分数排序执行任务。

该评分机制采用加权启发式算法,系统会为每张数据表计算五项独立分数,最终取最高分作为表的整体优先级。五项评分维度分别为:事务ID老化分数、多事务ID老化分数、待回收死元组数量分数、新增元组数量分数、上次分析后的数据变更量分数。

为了让评分机制可观测、可追溯,Postgres 19 新增 pg_stat_autovacuum_scores 系统视图,可直接查询数据库内所有数据表的实时评分数据,视图结构如下:

\d pg_stat_autovacuum_scores

               View "pg_catalog.pg_stat_autovacuum_scores"
       Column        |       Type       
---------------------+------------------
 relid               | oid
 schemaname          | name
 relname             | name
 score               | double precision
 xid_score           | double precision
 mxid_score          | double precision
 vacuum_score        | double precision
 vacuum_insert_score | double precision
 analyze_score       | double precision
 do_vacuum           | boolean
 do_analyze          | boolean
 for_wraparound      | boolean

其中 score 字段为数据表的综合最高优先级分数,其余五项 *_score 字段为各维度原始评分数据,直观展示每张表的运维优先级依据。

双场景数据表评分实测对比

为直观体现评分机制的运行逻辑,本次测试选取两类典型业务表:仅追加写入的事件日志表、频繁变更的业务队列表。测试前手动关闭两张表的自动清理功能,避免系统自动运维干扰评分结果。

CREATE TABLE append_log (id bigserial PRIMARY KEY, payload text)
  WITH (autovacuum_enabled = false);

CREATE TABLE churn_queue (id bigserial PRIMARY KEY, state int, payload text)
  WITH (autovacuum_enabled = false);

INSERT INTO append_log (payload)
  SELECT 'event' FROM generate_series(1, 500000);

INSERT INTO churn_queue (state, payload)
  SELECT 0, 'job' FROM generate_series(1, 200000);

UPDATE churn_queue SET state = 1 WHERE id % 2 = 0;
DELETE FROM churn_queue WHERE id % 5 = 0;

测试数据说明:日志表仅新增 50 万条数据,无修改操作;队列表先写入 20 万条数据,随后执行 10 万次更新、4 万次删除,产生大量死元组。执行pg_stat_force_next_flush()刷新统计采集器后,Postgres 给出的两张表评分如下:

SELECT relname, ceil(score) AS score,
       ceil(vacuum_score) AS vacuum_score,
       ceil(vacuum_insert_score) AS insert_score,
       ceil(analyze_score) AS analyze_score
  FROM pg_stat_autovacuum_scores
 WHERE relname IN ('append_log', 'churn_queue')
 ORDER BY score DESC;

   relname   | score | vacuum_score | insert_score | analyze_score 
-------------+-------+--------------+--------------+---------------
 append_log  | 10000 |            0 |          500 |         10000
 churn_queue |  6800 |         2800 |          200 |          6800

各项分数本质为数据表实际状态超出触发阈值的比例。append_log 无死元组,因此 vacuum_score 为0,海量新增数据使其 analyze_score 达到最高值;churn_queue 存在大量死元组,vacuum_score 较高,但整体优先级由 analyze_score 决定。两张表均以单项最高分作为最终优先级,因此日志表运维优先级高于队列表。

自定义权重:灵活调整运维优先级倾向

Postgres 19 新增六项可调优参数,支持自定义各维度运维优先级权重,其中五项为评分维度缩放系数,默认值均为1.0,代表所有运维需求优先级均等。

autovacuum_freeze_score_weight           = 1.0
autovacuum_multixact_freeze_score_weight = 1.0
autovacuum_vacuum_score_weight           = 1.0
autovacuum_vacuum_insert_score_weight    = 1.0
autovacuum_analyze_score_weight          = 1.0

所有权重参数默认值均为 1.0,代表各类运维需求拥有同等优先级。将 autovacuum_analyze_score_weight 调至 2.0,统计分析维度的优先级将翻倍;调至 0.5 则该维度评分减半。文档中还提供了兼容旧版本的回退方案:将五项权重全部设为 0.0,集群将恢复至 Postgres 19 版本之前仅按系统目录顺序处理表的调度逻辑,应对部分场景下旧调度机制更适配的情况。

接下来调整权重改变优先级倾向。假设死元组回收的优先级提升一倍,统计信息刷新优先级减半。该类参数属于 SIGHUP 参数,重载配置即可生效,无需重启数据库实例。

ALTER SYSTEM SET autovacuum_vacuum_score_weight = 2.0;
ALTER SYSTEM SET autovacuum_analyze_score_weight = 0.5;
SELECT pg_reload_conf();

权重调整后,两张表的运维优先级发生反转:

SELECT relname, ceil(score) AS score,
       ceil(vacuum_score) AS vacuum_score,
       ceil(analyze_score) AS analyze_score
  FROM pg_stat_autovacuum_scores
 WHERE relname IN ('append_log', 'churn_queue')
 ORDER BY score DESC;

   relname   | score | vacuum_score | analyze_score 
-------------+-------+--------------+---------------
 churn_queue |  5600 |         5600 |          3400
 append_log  |  5000 |            0 |          5000

调整后,churn_queue 表的死元组回收优先级显著提升,系统优先处理空间回收任务,实现运维策略的自定义适配。

新增数据独立评分的核心逻辑

插入、更新、删除操作对数据库的影响存在本质区别:更新和删除会产生死元组,造成表膨胀,是 Vacuum 机制需要清理的核心对象;而纯插入操作不会产生死元组,无需空间回收,但会大幅改变数据表数据体量,导致统计信息过期,引发查询规划器执行异常。

这也是 Postgres 13 引入独立插入触发阈值、Postgres 19 将其纳入独立评分体系的核心原因。数据仓库、日志表等纯追加业务场景无表膨胀压力,运维核心需求为刷新统计信息,独立评分机制可精准适配该类场景。

事务ID冻结的高优先级机制

PostgreSQL 通过事务ID标记行可见性,而事务ID为有限数值。若老旧数据长期未冻结,会持续逼近回卷阈值,触发数据库停机写入、强制紧急清理的保护机制。数据冻结属于强制性运维操作,所有数据最终都需要完成冻结处理。

事务ID评分、多事务ID评分分别用于衡量数据表 relfrozenxid、autovacuum_freeze_max_age,数据表老化越严重,冻结评分越高,优先级越靠前。

冻结权重具备特殊调优逻辑:权重数值大于1.0时,不仅会放大对应评分,还会缩小触发阈值。同时 Postgres 18 引入的 vacuum_failsafe_age、vacuum_multixact_failsafe_age 兜底参数(默认16亿),在 Postgres 19 中与评分体系联动。数据表触发兜底阈值后,Autovacuum 将跳过资源限速、索引清理等非核心操作,全速完成数据冻结。

Autovacuum 并行清理能力上线

Postgres 13 已支持手动 VACUUM 并行处理索引,但 Autovacuum 长期仅支持串行执行,多索引大表的运维任务会长期占用进程资源,效率低下。

Postgres 19 新增 autovacuum_max_parallel_workers 参数,支持 Autovacuum 工作进程调用并行线程,完成索引清理与收尾清理工作,参数设置非零值即可启用:

ALTER SYSTEM SET autovacuum_max_parallel_workers = 4;
SELECT pg_reload_conf();

优先级评分体系负责精准排序运维任务,并行工作机制负责提升单表运维效率,二者结合全面优化 Autovacuum 整体运维能力。

优化总结与未来迭代规划

本次新增的六项 GUC 参数,为 Autovacuum 提供了精细化的优先级调控能力。默认参数可兼容绝大多数常规业务场景,无需手动调整。全新的评分视图也彻底解决了 Autovacuum 运维行为无法直观观测的问题,实现运维状态可监控、可排查。

本次优先级调度体系的内核提交注释说明如下:

This is intended to be a baby step towards smarter autovacuum
workers.  Possible future improvements include, but are not limited
to, periodic reprioritization, automatic cost limit adjustments,
and better observability (e.g., a system view that shows current
scores).  While we do not expect this commit to produce any
earth-shattering improvements, it is arguably a prerequisite for
the aforementioned follow-up changes.

Autovacuum 机制始终处于持续迭代优化状态,本次 Postgres 19 的升级为后续智能化运维改造奠定了核心基础,进一步提升了 PostgreSQL 数据库后台运维的稳定性与可控性。

作者:Shaun Thomas

原文链接:

https://www.pgedge.com/blog/looking-forward-to-postgres-19-autovacuum-tweaks

也聊聊PostgreSQL中的空间膨胀与AutoVacuum PostgreSQL数据库,由于其自身特有的MVCC机制,它没有自己的Undo Log。更新操作相当于一个删除叠加一个插入操作,反映在表数据文件当中就是内部的一条新增记录,加上原有记录的删除。那些已被删除的元组(死元组)所占的空间如果得不到及时的回收,那么表数据文件所用空间将会不断膨胀,查询及其它CUD操作也会变慢,直到系统不可承受。这就是AutoVaccum存在的原因。 阅读详情

相关推荐

PostgreSQL autovacuum详解(自动化清理空间)

PostgreSQL的autovacuum是一种自动化的维护工具,用于管理数据库中的空间和性能,以提高数据库的效率和可靠性。

一碗清深的博客 2129

PostgreSQL(十七)Autovacuum工具

Autovacuum是PG的一个后台进程,在9.6版本之后才出现,在PG实例启动时自动启动;每隔一分钟执行一次自动收集需要做Vacuum操作的表;当表的操作记录满足指定条件时,自动执行Vacuum操作;(1)一次可以运行多少个Autovacuum进程autovacuum_max_workers =3 (缺省值)#Autovacuum的工作进程个数参数,意为一次可以运行多少个Autovacuum进程,可以使用此参数,对工作进程进程管理。此参数运用在可能包含多个数据库的实例/群集上;

shmily_coco的博客 2555

在 dell precision 7920 tower CentOS 8 Stream 上安裝nvidia驱动程序、Anaconda

简单记录一下如何在实验室dell precision 7920 tower CentOS 8 Stream上安装nvidia显卡驱动。

chen9046的博客 995

PostgreSQL autovacuum原理详解

1、概述 PostgreSQL的Vacuum可以帮助清除表中的死元组并释放空间,但是表上什么时候需要行vacuum操作呢? 一般来说不需要我们去手动进行vacuum操作,autovacuum进程会自动去对需要的表进行vacuum操作。 autovacuum进程会自动执行VACUUM和ANALYZE命令。启用后,将自动清理将检查具有大量插入,更新或删除的元组的表,然后根据阈值对表进行清理或分析。 那么autovacuum的阈值是多少呢?我们怎么才能知道哪些对象需要进行vacuum呢? 2、autovacuum

Focus on PostgreSQL 3937

新手友好的PythonUI库PySimpleGUI项目已下架,切换4.50.6版本的方法

过期后,如果还想使用 PySimpleGUI,则需要切换到版本 4,而版本 4 在 GitHub 上有很多社区维护的版本可以选择。开发团队尝试了 7 年,但始终没能获得足够的收入来维持项目的运营,尤其是开源项目通常面临资金不足的问题。商业许可证是永久有效的,用户可以在支持期结束后依然使用应用程序,并会提供离线版本的文档以供参考。尽管项目关闭,但对购买了商业许可证的用户,团队仍会在接下来的一年内提供支持。

baidu_34681715的博客 6860

Postgresql autovacuum 3 怎么调整参数,拯救你惨淡的性能

接着上两期来讲, PostgreSQL 中的autovacuum的后两个问题1 autovacuum 是否可以被关闭2 autovacuum 调整的参数有那些先从第一个问题看,autov...

sql server的专栏 1175

CH376S模块实战:如何通过串口轻松实现单片机与U盘的数据交互

本文详细介绍了如何利用CH376S模块,通过串口通信实现单片机与U盘的数据交互。文章从模块原理、硬件连接到核心指令集进行了全面解析,并提供了基于STM32的实战代码示例。CH376S模块极大地简化了USB协议和文件系统的复杂性,使开发者能快速为嵌入式设备添加便捷的数据存储与导出功能,适用于数据记录、配置导入等多种应用场景。

weixin_29165725的博客 458

postgresql autovacuum 之 不看不知道

最近工作压力很大,同时本着对阅读者负责的态度,原来是一天一篇的速度,必然是支持不下去了,所以以后会提高文字的质量,降低数量,对得起自己也对得起阅读的人。未来说不好,可能一周2篇,另外争取...

sql server的专栏 910

《UDS协议从入门到精通》系列——图解0x19:读取故障码信息

认识最核心的诊断服务“0x19”!!全网最强图解!一文搞懂所有常用子服务!

车载系统攻城狮 1万+

ABAP Channels 之 WebSocket 通信实践:用 ABAP Push Channel 打造实时应用

摘要:本文介绍了ABAP Push Channel(APC)技术,它通过WebSocket协议实现ABAP系统与外部客户端的实时双向通信。文章对比了传统HTTP轮询与WebSocket的差异,解释了APC的事件模型及其接口演进(从IF_APC_WS_EXTENSION到IF_APC_WSP_EXTENSION)。通过仓库拣货等实际案例,展示了APC在企业级应用中的价值,如实时监控、协作场景等。文中还详细阐述了ABAP引擎中WebSocket的交互模型,说明其资源优化设计原理,并提供了基础代码示例。该技术解决

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 298

PostgreSql autovacuum

一、 概述 一系列参数控制 vacuum 的自动执行,这些设置可以被针对每个表的参数设置所覆盖。 二、 参数说明 **autovacuum(boolean) **:控制服务器是否运行自动清理启动器后台进程。默认为 on 开启, 不过要自动清理正常工作还需要启用 track_counts(默认 on 启用)。 log_autovacuum_min_duration:控制超过该值指定时间的自动清理操作写入日志,默认为 -1,禁止写入日志,设置为 0 会记录所有的自动清理动作。如果指定值时没有单位,则以毫秒为单

脑子进水养啥鱼?的博客 1594

数字人接大模型第二步:语音克隆

推荐XTTS-v2项目,由Coqui公司开发的语音生成模型,专为多语言语音克隆和生成设计。它支持17种语言,包括英语、西班牙语、法语、德语、意大利语、葡萄牙语、波兰语、土耳其语、俄罗斯语、荷兰语、捷克语、阿拉伯语、中文、日语、匈牙利语、韩语和印地语。XTTS-v2的核心优势在于其仅需6秒的音频片段即可实现语音克隆,无需大量的训练数据。此外,它还支持情感和风格转移、跨语言语音克隆以及多语言语音生成,采样率高达24kHz。地址:https://github.com/archwesome/XTTS-v2。

404

postgresql autovacuum 4 怎么调整参数,让autovacuum 多干活,与成本的计算

接着上期说,在调整完几个常见的参数后,还有如下的参数可以调整提高autovacuum性能,转而提高你POSTGRESQL的性能autovacuum_vacuum_cost_limit:...

sql server的专栏 718

【YOLO11改进 - C3k2融合】C3k2融合动态蛇形卷积(Dynamic Snake Convolution)用于管状结构分割任务

【YOLO11改进 - C3k2融合】C3k2融合动态蛇形卷积(Dynamic Snake Convolution)用于管状结构分割任务

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 519

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

postgresql回收机制autovacuum

postgresql autovacuum delete操作行不会立即从数据文件中删除,而是通过xmax字段将其标记删除 update操作可能在postgresql中被视为delete+insert ##dead tuples select schemaname,relname,n_dead_tup, (case when n_live_tup>0 then n_dead_tup::float8/n_live_tup::float8 else 0 end) aa from pg_stat_all_ta

归来仍少年 2098

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

在postgresql中打开和关闭autovacuum

在postgresql中如何打开和关闭autovacuum。关闭后autovacuum还会做事吗?

liuzhilong的博客 2334

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

postgresql autovacuum作用与原理

什么是autovacuum auto autovacuum的作用 autovacuum触发条件 lineqi=# select name,setting from pg_settings where name like 'autovacuum%'; name | setting -------------------------------------+------------ autovacuum

weixin_41561946的博客 8165

PostgreSQL Autovacuum基础知识

本文结合原文和博主经验编写,阅读时间约20分钟,如有错误请指正.

荷塘月色 1704

PostgreSQL_autovacuum调优

注意:对ANALYZE的负面影响更严重一些,因为虽然VACUUM的成本主要与死行数量成正比(当表中死行很少时相当低,使不必要的清理变得便宜),但ANALYZE实际上必须在每次执行时重新构建统计信息(包括收集随机样本,这可能需要相当多的I/O)。它会获取表上的独占锁,阻止所有操作(包括只读查询),并创建表的新副本,这可能会使使用的磁盘空间量增加一倍(因此,当您的磁盘空间已经用完时,它特别不切实际)。此 MVCC 实现的缺点是,它会留下已删除的行,即使在可能看到这些版本的所有事务完成后也是如此。

2301_76513555的博客 1540

PostgreSQL autovacuum 优化与调试 (1 触发 autovacuum 的条件)

PostgreSQL 的数据库系统中是需要进行autovacuum 进行表级别的数据清理的。在开始autovacuum 进行调优之前实际上是需要理解为什么需要autovacuum.长话短...

sql server的专栏 1199

【PostgreSQL autovacuum清理死元组的相关优化】

如果有未提交的预定义语句,它们会阻止移除死元组。需要使用 COMMIT PREPARED或ROLLBACK PREPARED提交或回滚这些语句。//查询未提交的预定义语句的SQL如下。

小怪兽的博客 1864

PostgreSQL的AutoVacuum进程

AutoVacuum的一个重要功能是防止事务ID回绕(transaction ID wraparound),这是PostgreSQL中一个可能导致数据丢失的问题。在PostgreSQL中,AutoVacuum是一个后台进程,用于自动清理数据库中的冗余数据。它通过定期清理被删除或更新的行来回收存储空间,并更新统计信息,以提高数据库的性能和效率。总之,AutoVacuum是PostgreSQL中一个非常重要的后台进程,它通过自动清理和分析操作,帮助维护数据库的健康和性能。

文牧之的博客 1441

POSTGRESQL 一个 autovacuum 自控的想法与实现架构

随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是 POSTGRESQL, MYSQL ,MONGODB ,POLARDB ,REDIS 等,期待你的加入,加群请添加微信liuaustin3._____________________________________________________________________...

sql server的专栏 227

PG数据库AUTOVACUUM的优化小技巧

该阈值的计算是基于一些参数的设置的,这个设置可以是全局性的,也可以是针对某张表的(比如上面的storage参数),如autovacuum_vacuum_threshold,autovacuum_analyze_threshold,autovacuum_vacuum_scale_factor,和autovacuum_analyze_scale_factor。基于上面的原理,为某些大表设置合理的阈值,从而确保autovacuum在一种对业务系统影响尽可能小的平衡状态下运行,就可以确保业务系统长期稳定的运行。

DBAIOps的博客 2438

PostgreSQL VACUUM机制深度解析:从MVCC原理到AutoVACUUM调优实战

在数据库管理系统中,多版本并发控制(MVCC)是实现高并发事务处理的核心机制,它通过维护数据的多个版本来避免读写冲突。然而,MVCC机制会持续产生过期的“死元组”,占用存储空间并影响查询性能。为了解决这一问题,PostgreSQL引入了VACUUM机制,其核心原理是清理这些死元组、回收存储空间并更新可见性映射,从而优化数据库性能并防止事务ID回卷。这一过程对于维持数据库长期稳定运行具有关键的技术价值,尤其在频繁更新的OLTP场景中。通过合理配置AutoVACUUM守护进程,可以自动化执行清理任务,平衡性能开

weixin_34166472的博客 444
上一篇: PostgreSQL 日报| pgAdmin 4 v9.17 修复七个安全漏洞(8 月 4 日)
下一篇: PostgreSQL 日报|修复 WAL 归档恢复竞态条件(8 月 5 日)
IvorySQL
博客等级 码龄5年 745粉丝 565原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值