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

本文探讨了PostgreSQL中autovacuum的作用,包括数据清理、死行管理和性能影响。重点讲解了autovacuum的触发条件、工作内容、可调节参数及监控方法,强调了调整autovacuum参数对数据库维护的重要性。
摘要由CSDN通过智能技术生成

38f980d661883721e3abe8eee696bc06.png

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

长话短说,基于POSTGRESQL 的原理每个表中的行会存在多个版本的数据,为了完成数据库的MVCC 多版本控制,以及数据的UNDO 的功能在这些过期版本的行被弃用后,会产生众多的死行,dead tuple. 而这样的情况下,如果不及时的将这些dead tuple 进行清理,轻则影响磁盘空间的在利用,导致本来一张表5G可能就能存储,但最终可能达到10G 甚至更大的空间。

同时每个dead tuple 还牵扯这index 的问题,以及多版本比对时造成的性能损耗,所以一个表的 dead tuple 越多,数据查询的性能也就越来越低。 这也是postgresql  核心问题之一。

 在进行表的 autovacuum 之前,我们应该做的是了解系统当中到底是不是存在需要进行vacuum 的地方,也就是表的 dead tuple 到底有没有,有多少。

1  监控  monitor

表的dead tuple监控 其中我们

 pgbench -n -r -T 60 -P 1 -c 500 -j 64

先给我们的表增加一些数据

2d6594fbbe8d09dd0935c1e4b22786d2.png

select schemaname,relname,n_tup_ins,n_tup_upd,n_tup_del,n_live_tup,n_dead_tup,last_autovacuum,autovacuum_count from pg_stat_all_tables where schemaname = 'public';

通过上面的语句我们可以先查看一下当前的postgresql 中的表的dead tuple 以及autovacuum 的情况。

328e9761a26a90672fdd9b1641630fb1.png

从中这边可以发现,我们这些表中有的已经进行了autovacuum 有些没有,并且存在dead tuple.

提出问题

1  什么条件 autovacuum 对表进行vacuum  工作

2  autovacuum 进行了什么样的工作

3  autovacuum 是否可以被关闭

4  autovacuum 调整的参数有那些

5  autovacuum 针对某个特殊表进行调节

6  autovacuum 的工作情况怎么了解

下面针对以上的问题,分期来进行

1  什么条件 autovacuum  对表进行vacuum 工作

实际上 autovacuum 本身并没有想象的简单,他需要完成的工作除了上面提到 cleanup dead tuples ,同时他还的想如何减少在工作期间对系统的用影响。那么什么时间,什么频率 autovacuum来出来进行工作就是一个要考虑的问题。

这里抛出一个问题,如果我们通过上面的语句来查询dead tuple ,每次查询某个表的 dead tuple 的数量都特别的大, 这说明一个问题, autovacuum 做的不够多 (当然也有可能是一些long transaction,这个问题不在这个问题的考虑范围)。

实际上什么时间对表进行autovacuum 这个问题,应该换成频率,什么样的情况下会触发 autovacuum对表进行操作。

这里有两个关键的参数

autovacuum_vacuum_threshold  这个参数主要是指定表中变动的tuple数,超过这个数字会触发autovacuum 对这个表进行整理

autovacuum_vacuum_scale_factor  这个参数主要指定表的变动行占整体表的百分之几,超过这个占用的比率会触发  autovacuum

在操作过程中,如果表符合上述的两个条件,被autovacuum 扫描到就开始进行整理。

具体的过程为  修改表的行数 + 修改表的百分比*总的表的行数  <  实际修改的表的行数

举例: 我们本次修改的行数为 200行  , autovacuum_vacuum_threshold = 50   autovacuum_vacuum_scale_factor = 0.1 ,目前表的行数为1000000 一百万。

则 计算公式为 1000000 * 0.1 + 50 = 10万零50  当修改的表超过这个行数,才能触发autovacuum 。

所以一个表随着数据行数越来越多,则会导致触发autovacuum 越来越少,最终导致表的膨胀越来越大。

所以调整autovacuum 的参数对于一个基于postgresql核心的数据库是非常重要的。

e2f391569464eb1b94d5da3549806249.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值