1.什么是Vacuum:
PG pageinspect使用与块空间清理学习-CSDN博客
之前说过PG块更新的特点:先删除后插入,但老元组并不会真正删除,只是把老元组标记为删除状态,这就导致了PG中会有大量的垃圾数据,update所造成的资源消耗非常高。
Vacum用来整理垃圾的数据,释放垃圾数据。
2.Vacuum的作用:
1.移除死元组:
空间管理的作用,释放垃圾数据(也就是被标记为删除状态的行),并对每个页面的活元组进行碎片整理。
2.冷冻老的Txid:
任何数据库都有一个号码来记录事务的先后顺序,Oracle中叫SCN号(无穷大的整数),PG中叫做Txid(循环使用,最大42亿,到了42亿后,把前42亿冻结,这个冻结操作由Vacuum进行)。
3.其它
更新数据块,更新已处理表的FSM(空闲空间地图)和VM(可见性地图)。
删除不需要的clog文件。
3.Vacuum处理流程:
3.可见性地图
VM,一个表中有成百上千个数据块,为了提高Vacuum的效率,于是有了VM文件(可见性视图)
作用:可见性地图用来记录含有被删除行的数据块id,以提供给vacuum参考,自认为类似于oracle的BMB(位图块)。
简单说就是vm后缀文件记录了1247表中哪个数据块有垃圾需要处理。
4.Autovacuum Daemon
自动清理守护进程
默认每分钟执行一次,由autovacuum_naprime参数定义。
默认调用三个worker进程进行工作,由autovacuum_max_workers参数定义。
5.Full Vacuum
常规的vacuum操作,如果遇到一个行占用一个块,也会造成资源浪费。
full vacuum处理流程如下:
有点像Oracle的Shrinking操作,删除空闲行,然后调低高水位线,最后释放空闲块。
Shringking: Oracle 如何提高空间使用率?-CSDN博客
6.什么时候需要Full Vacuum?
1.创建一个表,随机插入十万条数据,查看当前数据块的使用情况。
当前共935个块,每个块空闲0.39。
2.当表被不断删除或更新:
删除后可用空间还是0.39,说明删除后空间并没有释放。
3.vacuum清理垃圾数据之后:
可以看到块内的可用空间虽然变多了可以用85%,但是块并没有被释放仍然是935个数据块。
说明当前块内的行很少,但是数据块很多,行很松散,如下图:
4.使用full vacuum查看效果
可以看到full vacuum把行变得紧凑,都放到了一个数据块中,导致数据块内可用空间为0。其余的块则被释放了。
学过oracle的话就可以发现,诶?这不是shrinking? 其实大体是一样的,shrinking把行变的紧凑,之把高水位线调低,高于高水位线的数据块则释放。
无非是PG中叫做Full Vacuum,Oracle中叫做shrinking。
Oracle Shrinking实验:Oracle 如何提高空间使用率?-CSDN博客