PG数据库AUTOVACUUM的优化小技巧

PostgreSQL VACUUM 之深入浅出 (五) 从一步一步精准触发 AUTOVACUUM, 到 VACUUM 优化实战,深入浅出,一看就懂 阅读详情

讨论了AUTOVACUUM的必要性,对于大型PostgreSQL数据库来说,AUTOVACUUM时必须的,而且优化好AUTOVACUUM对于大型PostgreSQL数据库来说至关重要。那么该如何来优化AUTOAVCUUM呢?今天我们就讨论一下优化AUTOVACUUM的一些常用的技巧。

首先我们要考虑的是三个基本的参数autovacuum_max_workers、maintenance_work_mem、autovacuum_freeze_max_age,这三个参数设置的合理,大部分AUTOVACUUM的问题都得到了解决。

autovacuum_max_workers指定了autovacuum使用的工作进程的数量,默认为3,对于绝大多数大型PostgreSQL数据库来说,这个值太小了。增加 autovacuum worker的数量意味着更多的进程可用于清理数据,这是面对数量非常多的表时需要考虑的问题。如果仅仅从autovacuum去考虑,理想情况下为每个 CPU 创建一个worker肯定会有最好的效率。因此worker的设置不应超过 CPU 的数量,但过多的worker可能会因 CPU 使用率的激增而对业务产生影响。通常应该将worker的数量设置为3-cpu_count之间。具体如何设置,需要在最大化autovacuum效率与整体系统性能之间进行平衡。如果你不知道该如何设置,那么最先设置为CPU_COUNT的1/2吧,如果在系统高峰期,CPU资源出现了瓶颈,那么适当缩小该值,如果CPU资源还很充足,但是autovacuum的性能不足,那么就增加这个值。

maintenance_work_mem,这个参数的值越大,vacuum的效率越高。不过要注意的是,当超出了每个设定后,增加该参数的效率会出现递减。太大的值会浪费内存资源,如果设置的太大耗尽了内存,那么就会产生十分严重的性能问题。对于较大的Post过热SQL数据库实例,如果物理内存充足,建议maintenance_work_mem至少设置为 1 GB,设置较大的参数将显着提高清理具有大量死元组的表的性能。 1 GB的维护工作内存足以一次处理大约 1.79 亿个死元组,如果你一次性要处理更多的死元组,那么还需要继续加大这个参数。如果这个参数设置不足以一次性清理如此多的死元组,那么会采用多次扫描的方式来清理,这样就会降低清理的性能。

autovacuum_freeze_max_age,合理设置此参数可以减少 TXID 回绕的机会。Max age越大,autovacuum运行的频率就越低,这样就可以减少整个系统的负载,降低业务高峰期的性能风险。但是和上面提及的所有 autovacuum 参数一样,参数的设置都具有两面性。将该值设置的太大,导致autovacuum延迟太久,那么可能会在autovacuum完成之前耗尽 txid 编号,从而导致服务器强制关闭以保护数据完整性。设置合理的参数取决于对你的系统的死元组年龄的持续观察。

可能对于很大一部分PostgreSQL数据库来说,合理设置了这三个参数就基本上可以高枕无忧了。不过我们往往会面临更为复杂的情况。对于电信、互联网、银行等的超大型的数据库来说,这三个参数还不足以解决autovacuum的问题。要彻底解决问题,那么就需要对这些系统级参数无法解决问题的表设置个性化的autovacuum参数。这些参数属于表的storage参数。通过ALTER TABLE .. SET STORAGE_PARAMETER可以进行个性化的设置。

Storage参数中,和Vacuum有关的参数很多。在数据库运行过程中,随着数据局的变化,死元组的数量也在增加。autovacuum 启动器进程持续监视数据库中的表,并在某张表中的死元组数量达到 autovacuum 阈值后为vacuum 作业选择正确的表。该阈值的计算是基于一些参数的设置的,这个设置可以是全局性的,也可以是针对某张表的(比如上面的storage参数),如autovacuum_vacuum_threshold,autovacuum_analyze_threshold,autovacuum_vacuum_scale_factor,和autovacuum_analyze_scale_factor。

autovacuum_vacuum_threshold 和 autovacuum_analyze_threshold这两个参数分别确定要为 autovacuum 和 autoanalyzer 表中从上一次vacuum后更新或删除的记录数的最小数量。两者的默认值都是 50。

autovacuum_vacuum_scale_factor 和 autovacuum_analyze_scale_factor参数分别确定要为 autovacuum 和 autoanalyzer 安排的表需要更改的表的百分比。默认autovacuum_vacuum_scale_factor值为 0.2 (20%) 和autovacuum_analyze_scale_factor 0.1 (10%)。

对于上述四个参数,如果表中的记录数不是很大,那么就可以使用全局的设置,默认的参数一般都没有太大问题。但是对于有大量行的超级大表,这些参数的默认值就完全不够用了。Vacuum threshold的计算公式如下:

vacuum threshold = autovacuum_vacuum_threshold + autovacuum_vacuum_scale_factor * n_live_tup

其中n_live_tup是活动元组的数量,这个值可以从pg_stat_all_tables视图获得。一旦死元组的数量达到了这个限额,那么就可以启动vacuum作业。如果 postmaster 启动工作进程失败,它会在共享内存中设置一个标志并向启动进程发送一个信号。读取 postmaster 的信号,启动器再次尝试通过向 postmaster 发送信号来启动工作进程(postmaster 未能启动工作进程可能是因为高负载和内存压力或已经运行的进程太多)。

基于上面的原理,为某些大表设置合理的阈值,从而确保autovacuum在一种对业务系统影响尽可能小的平衡状态下运行,就可以确保业务系统长期稳定的运行。从另外一个角度来说,对于超大型的PostgreSQL数据库来说,加强对pg_stat_all_tables中相关的统计数据的监控,也可以为我们动态的优化autovacuum提供最为准确的依据。

解析 openGauss 的 AutoVacuum 机制及优化策略 AutoVacuum顾名思义就是“自动”进行的Vacuum操作 ,它是数据库系统的一个自动化功能,用于定期清理数据库表中的过时数据,释放存储空间,并更新表的统计信息。通过定期清理过时数据和更新统计信息,AutoVacuum 可以确保数据库的性能保持在一个良好的水平,提高系统的稳定性和可靠性。- log_autovacuum_min_duration:当自动清理的执行时间大于或者等于某个特定的值时,向服务器日志中记录本次自动清理执行的概要信息。设置此选项有助于追踪自动清理的行为。 阅读详情

相关推荐

postgresql autovaccum自动清理

postgresql autovaccum

日常博客 3439

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

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

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

一碗清深的博客 2128

PostgreSQL VACUUM之深入浅出 (五)

`autovacuum_freeze_max_age` 是 AUTOVACUUM 最不常用的参数,也基本不需要优化,但却是 AUTOVACUUM 最重要的一个参数,因为它与 wraparound 有关,即使 AUTOVACUUM 关闭,达到这个阈值,也会强制触发 AUTOVACUUM ,可见它有多重要。

荷塘月色 405

deap数据集的情绪检测代码环境搭建与实现

deap数据数据集很大

f的博客 4157

@transactional滥用导致数据源连接池耗尽问题

@transactional滥用导致数据源连接池耗尽问题

qq_43205267的博客 1200

PG数据库为什么要用autovacuum

我们可以看到,一个系统中的有些表的死元组比例十分高,有些表则很低。一个比较简单和常用的做法是,首先列出你的系统中的超过1GB的大表(这个阈值根据你的系统的特点去调整,我这里只是举例),然后分析其行数和死元组的数量,比例。甚至在给一个快递公司做一个执行计划稳定的优化的时候,我发现因为每天有几次大批量的数据写入,经常会导致某些时段中的表统计数据必然会导致错误的执行计划出现,因为应用中存在应用中动态拼凑SQL,导致所需的执行计划无法通过HINT固定,而白天业务高峰期经常对超大型的表做分析又风险太大。

DBAIOps的博客 728

从零构建:用Arduino和MCP2515模块搭建你的第一个CAN Bus网络

本文详细介绍了如何使用Arduino和MCP2515模块从零搭建CAN Bus网络,实现温湿度数据的传输与显示。涵盖硬件连接、软件配置、发送端与接收端代码实现,以及系统调试和进阶应用,帮助初学者快速掌握CAN总线通信技术。

d6e7f8的博客 833

PG日志中出现 “canceling autovacuum task“

PG日志中出现 “canceling autovacuum task” 的错误信息通常是因为自动真空任务被取消了。因此,“canceling autovacuum task” 是一种正常现象,通常不需要特别处理。但如果频繁出现此类错误,建议检查是否存在锁冲突、长时间运行的事务或其他并发操作,并进行相应的优化和调整。

喝醉酒的小白 2065

15、运行语音识别应用:从Mac到微控制器的部署指南

本文详细介绍了如何在Mac上运行语音识别应用,并将其部署到Arduino Nano 33 BLE Sense和SparkFun Edge等微控制器设备上的完整流程。内容涵盖应用构建、设备特定的音频与输出实现、部署步骤、常见问题解决方案及进一步优化建议。通过本指南,开发者可快速实现基于TensorFlow Lite的嵌入式语音识别系统,并根据需求进行自定义修改与功能扩展。

l3m4n的博客 57

用 ABAP ADK 写一个可控的自建表归档程序:从选择屏幕到 ARCHIVE_SAVE_OBJECT 的完整链路

文章摘要: 本文介绍了SAP系统中数据归档的核心概念与实践方法。归档旨在将不常访问但需保留的数据从在线数据库移出,以减轻系统负载,同时满足合规要求。文章重点阐述了: 归档与备份、重组的本质区别 SAP归档框架的核心组件:归档对象(AOBJ)、归档管理界面(SARA)和ADK开发工具包 通过YAPTMAIN表示例,展示了完整的归档流程: 使用选择屏幕控制归档范围 管理归档会话 写入归档记录 生成统计报表 强调了归档程序设计中需要考虑的运维、审计和性能因素 该方案可有效解决自建日志表"悄悄长胖&quo

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

Pg数据库日常维护操作指南

知道的越多不知道的越多,即使各种数据库直接都有相通的思想和不同的实现,关于pg数据库元祖分析和事务xid冻结,请持续关注我后续博客。

查拉图斯特拉talk的博客 2103

【AI大模型应用开发】3.2 RAG实战 - RAG应用+UI实现加载本地文件并对话

前面我们实现了RAG基本流程,今天我们在此基础上给它加个UI界面,在浏览器打开,实现上传本地文件、解析,并用大模型实现与该文档的对话。也就是一个阉割版demo版的ChatPDF或知识库对话系统。

同学小张的博客 3054

大云海山数据库(He3DB)AutoVacuum源码解析

AutoVacuum是数据库基于MVCC(多版本并发控制)机制设计的自动化维护功能,其核心价值在于解决MVCC带来的固有问题,规避手动维护短板,保障数据库长期稳定运行,具体原因如下:1、 解决表膨胀问题:数据库执行update/delete操作时,不会直接删除旧元组,仅标记为“死元组”以保障并发事务可见性。这些死元组长期堆积会占用大量磁盘空间,导致表和索引体积膨胀,大幅增加查询扫描范围,降低执行效率,AutoVacuum可及时清理此类无效数据。

weixin_43544348的博客 729

PCIe Link Training 深度解析:从物理检测到高速数据传输

本文深入解析PCIe链路训练(Link Training)的技术细节,揭示了这一复杂协商过程的五个关键阶段:物理检测阶段通过电气特性识别设备连接;轮询阶段建立时钟和符号同步;配置阶段确定链路宽度并处理拓扑异常;恢复阶段完成速率切换和信号均衡;最终进入正常工作状态。文章特别强调了高速率下的均衡技术挑战,以及验证工程师需要关注的多个维度,包括状态机跳转、有序集内容、均衡算法和错误恢复能力。随着PCIe速率不断提升,理解这一底层机制对高速接口设计具有重要价值。

元直的博客 1655

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PostgreSQL(十七)Autovacuum工具

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

shmily_coco的博客 2555

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

sql server的专栏 1199

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

pg13特性:仅插入表上的autovacuum

为什么会有仅插入表上的autovacuum,没有死元组也需要vacuum吗?

liuzhilong的博客 647

PostgreSQL13优化AUTOVACUUM说明

PostgreSQL13的AUTOVACUUM机制自动清理死元组、更新统计信息并冻结事务ID。对于10个以上数据库的实例,需优化默认参数(如增加worker数量、调整清理频率)。当数据库超过200个时,建议延长清理间隔并配合夜间定时脚本执行VACUUM ANALYZE操作。脚本会分析各数据库死元组数量,对超标数据库进行清理,避免影响日间性能。这种组合方案能平衡资源占用与清理效率。

weixin_40794002的博客 376

【数据库测试】PG数据库表膨胀及优化浅析

qquad本文对Postgresql数据库关系表膨胀、vacuum、autovacuum以及怎么监控和处理表膨胀做简单说明。表膨胀如何产生表的数据和索引占用文件系统的空间,在有效数据未发生大的变化情况下,占用空间不断增大,造成磁盘空间浪费。实际上MB的数据可能变为GB级别。表膨胀危害1) 空间持续上涨空间无法回收,需要执行高额代价vaccum full,但是vacuum full会对表加8级锁AccessExclusiveLock(访问排它锁),阻塞对象访问2)扫描效率变低。

test_dog的博客 1169

PostgreSql autovacuum

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

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

autovacuum调优的基本知识

autovacuum调优的基本知识

liuzhilong的博客 1381

PostgreSQL autovacuum原理详解

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

Focus on PostgreSQL 3937
上一篇: PG数据库为什么要用autovacuum
下一篇: 使用tuned profile来优化PG和Oracle数据库
DBAIOps社区
博客等级 码龄3年 970粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值