PG数据库为什么要用autovacuum

PostgreSQL性能调优实战:如何用pg_stat_user_tables揪出拖慢查询的‘元凶‘ 本文深入探讨了如何利用PostgreSQL的pg_stat_user_tables视图进行性能调优,帮助DBA快速定位导致查询缓慢的全表扫描问题。通过解析关键指标如顺序扫描次数、索引使用率和死元组比例,结合实战查询和优化建议,有效提升数据库性能。文章还提供了高级诊断技巧和自动化脚本示例,是PostgreSQL性能优化的实用指南。 阅读详情

很多PG的老用户都对AUTOVACUUM存有不好的印象,因为VAVCUUM导致的系统问题也让运维人员对PG有十分不好的印象,甚至认为PostgreSQL 不适合于7*24的高并发负载场景。实际上,任何数据库技术都会有不堪的童年,就算是现在的王炸Oracle,当年也让DBA痛恨不已。二十多年前,我从使用RDB数据库转向使用ORACLE的时候,第一印象是,这是个什么玩意,咋这么难用呢。等用惯了Oracle之后回头再看看RDB,就会对RDB百般看不惯了。记得二十年前,Oracle OPS刚出来的时候,也让好多人吃过苦头,甚至很多人十多年过去了,还不太敢用ORACLE RAC。记得差不多15年前,Oracle 负责售前的总监还多次和我探讨在国内,如何去推广Oracle RAC,让客户的核心系统敢于迁移到Oracle RAC上,为此,我还写了《Oracle RAC日记》这本书。

针对PostgreSQL的VACUUM,十多年前我和一个客户还一起写过一篇关于MVCC实现技术对PG应用场景限制的论文,其主要问题也是因为VACUUM存在的问题。不过如果现在有人问我要不要启用AUTOVACUUM的时候,我会毫不犹豫地说,一定要用AUTOVACUUM,而且只有用好了AUTOVACUUM,才算你用好了PG数据库。

有些朋友担心VACUUM会锁定数据库表,影响DML操作,实际上VACUUM并不会阻塞SELECT/INSERT/UPDATE/DELETE等操作,它只会在表上获取一个SHARE UPDATE EXCLUSIVE锁,这个锁只会阻塞一些特殊情况的操作。比如:

  1. 其他的SHARE UPDATE EXCLUSIVE锁请求,比如一个执行VACUUM FULL操作、ANALYZE或者CREATE INDEX CONCURRENTLY, REINDEX CONCURRENTLY, CREATE STATISTICS或者ALTER TABLE、ALTER INDEX等操作的会话;
  2. 其他是由SHARE锁的操作,比如CREATE INDEX;
  3. SHARE ROW EXCLUSIVE锁请求,CREATE TRIGGER和部分ALTER TABLE操作;
  4. EXCLUSIVE锁请求,比如执行 REFRESH MATERIALIZED VIEW CONCURRENTLY的会话;
  5. ACCESS EXCLUSIVE 锁请求,比如执行DROP TABLE, TRUNCATE, REINDEX, CLUSTER, VACUUM FULL、REFRESH MATERIALIZED VIEW 。以及一些需要这个锁级别的 ALTER INDEX 和 ALTER TABLE操作。

除此之外,如果系统中存在长时间的事务或者大查询,MVCC也需要访问一些老版本的数据,这样也会导致VACUUM执行时跳过对一些死元组的清理。从而引起一些很长时间以前的死元组无法正常清理。

从上面的情况分析来看,VACUUM对实际的应用影响并没有想象的那么大,对于绝大多数应用场景来说都是可以接受的。虽然如此,很多吃过AUTOVACUUM苦头的DBA出于惯性,都会选择关闭AUTOVACUUM而采用手工VACUUM,等业务不忙的时候去手工执行VACUUM操作,这是因为业务高峰期的VACUUM会导致大量的元组被锁定,整个系统的负载变大,交易性能急剧下降。

这种关闭AUTOVACUUM的做法,一般来说是通过设置一个定时任务,在晚上业务比较少的时候统一做VACUUM。这种做法对于一些应用场景有一定的作用,可以避免不确定的VACUUM操作在特殊高并发场景下引起严重的性能问题。但是在应用系统的场景中,这样操作容易引发一些更为严重的问题,这是因为VACUUM不仅仅是做死元组的回收工作,还会做表分析操作。

一些老Oracle dba可能还有印象,当时从Oracle 8i升级到9i之后,很多SQL的执行计划都出错了。分析了好长时间才定位,这是因为表的统计数据不够准确,或者部分表没有做统计,导致了一些SQL的执行计划出现了问题。PG数据库的CBO优化器也类似与Oracle ,不过因为PG的优化器在算法上还是无法与Oracle媲美,因此PG优化器对统计信息的准确性依赖度很高。一旦某些表的统计数据不够新了,无法反映出数据的实际情况,那么很可能会出现执行计划错误。每天定时做一次VACUUM存在两个弊端,第一个是,如果VACUUM操作进行时,如果出现了前面我们讨论过的集中锁冲突的情况,那么就会跳过这张表的VACUUM操作,从而没有完成死元组的清理。这样就会导致死元组积压,下一次VACUUM的时候,需要处理的时间更长,对系统的影响更大。而如果使用AUTOVACUUM,那么VACUUM操作会被分散在一天的任何时段中,当表中的数据变化积累到一定量的时候,AUTOVACUUM就自动触发了,这种VACUUM比积累了大量变更数据时更为轻便,完成的时间也更短,对应用系统的影响也会越低。

AUTOVACUUM的另外一个好处是,表上的统计信息可以得到更为迅速的更新,表统计信息也会更为准确。PostgreSQL的CBO优化器十分依赖于精准的表统计信息,如果统计信息更为精准,那么SQL的执行计划也会更为准确。在Oracle 9i时代,我经常处置的就是因为统计信息不准确而导致的执行计划错误问题。甚至在给一个快递公司做一个执行计划稳定的优化的时候,我发现因为每天有几次大批量的数据写入,经常会导致某些时段中的表统计数据必然会导致错误的执行计划出现,因为应用中存在应用中动态拼凑SQL,导致所需的执行计划无法通过HINT固定,而白天业务高峰期经常对超大型的表做分析又风险太大。最后我只能通过白天定期通过估算值写入估算的统计信息,晚上业务不忙时再做一次分析的方式解决了这个问题。

类似这个问题的情况,在PostgreSQL数据库中也会出现,而AUTOVACUUM可以在表的数据变化达到某个阈值的时候自动触发VACUUM和ANALYZE操作,从而让表的统计信息得到纠正,从而确保执行计划的合理。

既然AUTOVACUUM如此重要,那么如何做好AUTOVACUUM就更为重要了。实际上,现在的服务器硬件水平和经常出VACUUM事情时代的PG 8/9时代已经不一样了,VACUUM的算法也得到了极大的改善,因此现在的AUTOVACUUM的风险已经大大降低了。虽然如此,对于AUTOVACUUM仍然需要优化。

优化AUTOVACUUM的第一步是未VACUUM操作分配足够的工作内存,maintenance_work_mem参数对应VACUUM的性能有着至关重要的作用,对应较大型的数据库系统,拥有超过10GB的单表的数据库,我们一般至少要给这个参数1GB以上的值。对物理内存比较充裕的系统,将maintenance_work_mem设置为2GB是我比较常用的。另外一个和VACUUM操作相关的参数autovacuum_work_mem可以设置为-1,这样这个参数就会参考maintenance_work_mem参数。

第二个十分重要的参数是autovacuum_max_workers,这取决于有多少张表的VACUUM操作可以并行执行,如果你的系统中有大量的小表,那么就建议把这个参数设置大一些。当然如果你的CPU资源不是很多,那么就不要设置太大的值了。

今天篇幅有限,对于AUTOVACUUM的其他一些参数就不一一讨论了,最后我再谈一个VACUUM的使用心得。那就是对于大型或者超大型的系统,不能仅仅采用全局统一的AUTOVACUUM,对于某些特殊的大表,要采取特殊的AUTOVACUUM策略,也就是说需要设置表级的AUTOVACUUM策略。这一点和我们在运维ORACLE数据库的时候,也会经常遇到,对于一些大表的表分析,不能采用系统默认的方式,而要采取特殊的自定义分析方式,否则很容易出问题。

我们可以看到,一个系统中的有些表的死元组比例十分高,有些表则很低。对于一些死元组比例比较高的大表,我们需要根据其业务特点来设置独立的策略。一个比较简单和常用的做法是,首先列出你的系统中的超过1GB的大表(这个阈值根据你的系统的特点去调整,我这里只是举例),然后分析其行数和死元组的数量,比例。同时监控其上次表分析和VACUUM的时间,看看是否合理。如果经常出现某张表很长时间没有做VACUUM和ANALYZE,那么这张表的默认AUTOVACUUM参数有可能不够合理,需要调整表上的这些参数。另外如果你确实反省自动VACUUM导致了某些业务不正常,那么也有可能是相关表上的AUTOVACUUM参数设置不合理导致的,那么你可以通过调整这些参数来解决这个问题,而不要不分青红皂白就关掉AUTOVACUUM。

postgresql autovaccum自动清理 postgresql autovaccum 阅读详情

相关推荐

PostgreSQL 核心架构学习–以内存管理为中心

PostgreSQL 核心架构学习–以内存管理为中心

weixin_42236936的博客 1915

PostgreSQL(十七)Autovacuum工具

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

shmily_coco的博客 2555

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

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

一碗清深的博客 2128

postgresql autovacuum作用与原理

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

weixin_41561946的博客 8165

手把手教你用CMake和MinGW64编译libuvc:静态链接与动态链接的选择

本文详细指导如何在Windows平台上使用CMake和MinGW64编译libuvc库,并深入探讨静态链接与动态链接的选择策略。通过对比两种链接方式在部署复杂度、内存占用和版本管理等方面的差异,帮助开发者根据项目需求做出最优决策,实现高效的USB摄像头开发。

weixin_29171087的博客 254

从零开始安装 Windows 11 和 Ubuntu 22.04 双系统

本文详解Windows与Ubuntu 22.04双系统安装流程:需提前确认BIOS模式(UEFI/GPT或Legacy/MBR),关闭BitLocker加密、设备加密及快速启动;推荐Rufus/Ventoy制作启动盘。安装时需规划分区方案(建议单独划分EFI系统分区),注意引导器安装位置选择。双系统启动通过BIOS引导顺序管理,安装后需同步Windows与Linux系统时间。教程适配主流UEFI+GPT设备,强调操作前数据备份及Windows更新策略调整,避免兼容性问题。

萑澈的博客 3767

PG数据库AUTOVACUUM的优化小技巧

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

DBAIOps的博客 2438

实现自己的AI视频监控系统-第一章-视频拉流与解码4(重点)

使用本章节代码请引用此优快云链接,尊重知识、尊重他人劳动。这一小节将正式进入代码实现部分。我们会结合实际业务需要和拉流解码流程实现一个灵活、轻便、易用的视频拉流解码模块,支持多路视频拉流解码且可以动态更新更新内部参数。在开始设计之初,我们首先考虑的是使用大家所熟知的 **OpenCV(cv2.VideoCapture)**来实现拉流和解码功能。它的 API 简单直接,几行代码就能实现从网络流中读取帧,对于快速原型验证来说非常方便。然而,在经过深入的调研和测试后,我们发现 OpenCV 在处理多路视频流、追

soulproficiency的博客 2268

2024年大数据最全Pg数据库日常维护操作指南_pg数据库维护(3),2024年最新35岁的程序员被裁

本文主要用来记述pg数据库的相关操作和异常排查指南,继上一篇博客之后,异常的频繁更新,导致死亡元组指数级增长之后,空间占用也成倍增长,逻辑问题导致了数据库问题,但细想之下也发现,当pg在面对海量数据的更新删除之后,频繁的autovacuum会导致数据库大量的I/O,完了又会影响其他进程,就参数配置来看,还是有蛮多优化的空间的,毕竟空间和时间是两个相生相克的关系。而且默认配置的的自动间隔是1分钟,我觉得这里面有很大的优化空间,尤其是海量数据。

2401_84573183的博客 1068

【WorkBuddy专栏32】从「分文件夹」到「组队打仗」——WorkBuddy v5.0项目模式深度拆解

【WorkBuddy专栏32】从「分文件夹」到「组队打仗」——WorkBuddy v5.0项目模式深度拆解

AI人人懂 297

华为OD机考双机位C卷 - 虚拟理财游戏(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 虚拟理财游戏(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 668

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

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

查拉图斯特拉talk的博客 2103

RockChip Android14 修改LCD背光最大值

在调试LCD屏时时长会出现硬件不匹配,导致电流过大,屏幕发热严重。在不调整硬件的情况下,我们可以通过修改软件,降低LCD背光最大值来实现适配。我们都知道LCD屏背光是靠pwm来控制,一般来说最大值可以设置为255,针对上述问题,我们可以通过软件来降低该值,比如200,100等等。

qq_34968572的博客 631

PostgreSQL查看长时间未被autovacuum的表

由于PostgreSQL的多版本机制,使得经常被使用的表需要进行vacuum来回收哪些dead tuples,尽管pg有autovacuum进程去在后台vaccum相关的表,但是我们仍需要去监控哪些表长时间未被autovaccum过。 SELECT schemaname ,relname ,n_live_tup ,n_dead_tup ,last_autovacuum FROM pg_stat_all_tables ORDER BY n_dead_tup /

Focus on PostgreSQL 2208

某联达OA任意用户登录漏洞复现

由于`/WebService/Lk6SyncService/DirectToOthers/GetSSOStamp.asm`j接口未作限制,导致可以通过该接口调用`admin`的`cookie`值,通过对`LoginCredence`和`LoginTimestamp`的参数修改,进而实现任意登录进去系统.

千寻的博客 1589

业态即战场:零售平台的生意模型与系统设计解构

在这篇文章中,我们从“控货、自营、联营”三种典型零售业态出发,拆解了亚马逊、阿里、京东和本地闪购平台在商品模型设计上的差异与博弈。看似简单的卖货方式背后,其实是平台在“控货权”“商品归属权”上的深层策略博弈:谁掌控商品,谁就掌控数据、流量与利润分配权。本文尝试用一套通俗但不失专业的方式,帮助产品经理和技术伙伴读懂零售平台商品模型的底层逻辑与系统设计演化路径。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 13万+

PG的进程架构

3 PG的进程架构 文章目录3 PG的进程架构运行流程分析1 Postmaster主进程和服务进程2 BgWriter(后台写)进程3 PgArch(归档)进程4 PgStat(统计数据收集)进程5 AutoVacuum(自动清理)进程6 WalWriter(预写式日志写)进程7 CheckPoint(检查点)进程**8. SysLogger进程** PostgreSQL采用的是经典的C/S架构模型。 运行流程分析 当一个前端数据库应用程序需要访问数据库: 调用libpq,将连接请求发送给Postmas

murkey的专栏 2071

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

PostgreSQL生产环境数据库管理核心实践

PostgreSQL数据库管理远不止SQL操作,而是涵盖元数据、实例、数据库与对象四层的工程化体系。其核心原理在于通过分层控制保障数据一致性、访问可控性与故障可恢复性,技术价值体现在避免误删、性能劣化和跨版本迁移失败等真实风险。典型应用场景包括高并发订单系统运维、金融级数据审计、多租户SaaS权限隔离及RPO/RTO严苛的灾备建设。本文深入解析pg_dump备份策略、pg_basebackup物理恢复、WAL归档机制及autovacuum调优等关键实践,直击生产环境中DROP DATABASE误操作、连接风

weixin_34380948的博客 343

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

[译]PostgreSQL16-新特性-新增IO统计视图:pg_stat_io

PostgreSQL16-新特性-新增IO统计视图:pg_stat_io我们DBA常遇到的问题是:如何优化数据库的IO操作?获取PG服务产生的所有IO情况历来都是一个挑战。首先,PG将IO行为范围内为写WAL和读写数据目录(也就是数据文件)。真正的挑战是:理解围绕写入的二阶效应:通常数据的写入发生在事务提交后,即异步刷写,这就对理解哪个进程实际写入数据目录(以及何时)带来困难。当面临预分配的IOP...

帅的数说 1366

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

PostgreSQL每日一贴-数据库磁盘空间占用

任何数据库都存在表膨胀的风险,数据库设计时,应该识别出会频繁更新(包括新增、删除、更新记录)的表。对表、表空间做出可能达到的最大值的预判。 数据库空闲空间管理,PostgreSQL 8.3及之前前采用的是单一文件管理数据文件空闲空间的方式,PostgreSQL 8.4修改为了对每个数据文件都创建一个空闲空间管理文件来管理空闲空间,但是索引空闲空间由于其特殊性仍旧无法合理管理。并且作为数据库管理员

失语者的专栏 4771

PostgreSQL性能调优:解决表膨胀、索引碎片和无效索引问题

PostgreSQL表膨胀与索引碎片严重影响数据库性能,主要由MVCC机制导致。表膨胀指数据文件远超实际大小,索引碎片表现为不连续页面分布。这些问题会浪费存储空间、降低查询效率并增加维护成本。解决方案包括:优化VACUUM配置、定期重建索引(REINDEX)、使用在线重组工具(pg_repack),以及删除无效索引。最佳实践建议建立监控体系、合理设计索引、在业务低峰期执行维护操作。随着PostgreSQL版本更新,表膨胀管理将更智能化和自动化。通过定期维护和合理配置,可确保数据库长期保持高性能。

码道源码 2015

Postgresql 表、索引膨胀监控

背景 PG数据库表空间膨胀会带来空间资源浪费,所以需要 监控数据库表膨胀浪费空间前10的表,及时清理。 查询表膨胀情况 select datname from pg_database where datname not in ($$template0$$, $$template1$$)'` do psql -d $db --pset=pager=off -q -x -c 'SELECT current_database() AS db, schemaname, tablename, relt

高矮 1912

PG数据库日常应用

PostgreSQL数据库日常维护全攻略:从基础操作到生产级运维。本文系统整理PG数据库的完整维护流程,涵盖登录/库表管理/模式操作等基础操作,重点讲解备份恢复、远程连接配置、密码重置等核心运维技能,并深入生产环境必备的高级知识点:自动清理防膨胀、索引维护优化性能、慢查询定位、WAL日志管理、安全加固措施等。提供可直接落地的自动化运维脚本,帮助DBA和后端工程师掌握从开发环境搭建到生产环境高可用运维的全套技能,确保数据库稳定高效运行。

kiku1818的博客 969

如何处理表或索引的膨胀

vacuum full的过程,会改变table的pg_relation_filepath,会改变index的pg_relation_filepath。pg_repack的过程,会改变table的pg_relation_filepath,会改变index的pg_relation_filepath。警告:不带任何参数的pg_repack会直接repack,不要pg-repack不带参数直接敲回车!pg_repack的过程,不会改变table的oid,不会改变index的oid。

HighGO 745

PostgreSQL 入门学习教程,从入门到精通,PostgreSQL 16 服务器配置与数据库监控终极指南 —语法、案例与实战(18)

PostgreSQL 16服务器配置与监控指南涵盖核心配置文件和关键参数设置。主配置文件postgresql.conf控制全局参数,pg_hba.conf管理连接认证。配置方式分5级优先级,从会话级到全局默认。指南提供查看/修改配置的实用命令,如SHOW、SET和pg_reload_conf()。详细说明连接认证配置(包括推荐使用scram-sha-256)、资源管理(内存、并发)、WAL日志设置(支持PITR备份)和查询优化器参数调整。

qq_45746668的博客 438
上一篇: 数学没学好连建个索引都建不好了吗
下一篇: PG数据库AUTOVACUUM的优化小技巧
DBAIOps社区
博客等级 码龄3年 970粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值