PG--vacuum概述

Posted 进击的CJR

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PG--vacuum概述相关的知识,希望对你有一定的参考价值。

vacuum概述

磁盘清理dead tuple ;更新统计信息;重组数据;解决事务ID回卷问题。


vacuum做了什么

1、清除update或delete 操作后留下的死元组

2、跟踪表块中可用空间,更新free space map

3、更新visibility map,index only scan 以及后续vacuum都会利用到

4、冻结表中的行,防止事务ID回卷

5、配合analyze ,定期更新统计信息

fsm是什么

是找到可以用的位置,vacuum只是清理死元组,利用FSM可以高效的将空间管理起来,方便查找和重新使用。


visibility map是什么

create extension pg_visibility;
select * from pg_visibility(test01);
blkno | all_visible | all_frozen | pd_all_visible
-------+-------------+------------+----------------
0 | t | f | t
1 | t | f | t

all_visible为t表示全部可见,不包含死元组,执行vacuum可以直接跳过为t的数据库,有效加快vacuum执行速度。


表膨胀

表膨胀是指有效数据量不变,表越来越大,扫描的效率变低。是因为PG的MVCC写数据时,旧数据不删除,把新数据插入,将旧数据标记为无效,清理之前一直占用空间。执行update的话就是insert+delete的原理,依然会导致表膨胀。而执行vacuum可以有效解决表膨胀的问题。

vacuum full

会对表进行一个重组,意味着表的OID会变,所以不能在我们日常操作中,要定位表的OID的时候,不能通过pg_class的oid来找。得通过pg_class的relfilenode来找。vacuum full最大会占用原来磁盘空间的两倍,预留好磁盘空间。vacuum full 阻塞一切读写(8级锁)

可以看到执行vacuum full 后表的OID发生了改变

insert into test02 values (generate_series(1,100));
postgres=# vacuum test02;
VACUUM
postgres=# select pg_relation_filepath(test02);
pg_relation_filepath
----------------------
base/13593/16672
(1 row)

postgres=# vacuum full test02;
VACUUM
postgres=# select pg_relation_filepath(test02);
pg_relation_filepath
----------------------
base/13593/16718
(1 row)


autovacuum

触发条件

触发AutoVacuum条件,达到这个百分比数据量死元组变化,将触发

reltuples*autovacuum_vacuum_scale_factor+autovacuum_vacuum_threshold

postgres=# show autovacuum_vacuum_threshold;
autovacuum_vacuum_threshold
-----------------------------
50
(1 row)


postgres=# show autovacuum_vacuum_scale_factor;
autovacuum_vacuum_scale_factor
--------------------------------
0.2
(1 row)

postgres=# insert into test02 values (generate_series(1,100));
INSERT 0 100

表行数*autovacuum_vacuum_scale_factor+autovacuum_vacuum_threshold
触发AutoVacuum条件,达到这个数据量变化

postgres=# select 100*0.2+50;
?column?
----------
70.0
(1 row)

​reltuples 表存活行

select reltuples ,relpages from pg_class where relname=test02;
reltuples | relpages
-----------+----------
100 | 1

修改触发条件

alter table test02 set (autovacuum_vacuum_scale_factor=0.001);

autovacuum launcher进程

是守护进程,fork出autovacuum_max_workers进程进行AutoVacuum,下面例子显示并发数为3

select name,setting from pg_settings where name like %autovacuum%;
name | setting
-------------------------------------+-----------
autovacuum | on
autovacuum_analyze_scale_factor | 0.1
autovacuum_analyze_threshold | 50
autovacuum_freeze_max_age | 200000000
autovacuum_max_workers | 3
autovacuum_multixact_freeze_max_age | 400000000
autovacuum_naptime | 60
autovacuum_vacuum_cost_delay | 2
autovacuum_vacuum_cost_limit | -1
autovacuum_vacuum_scale_factor | 0.2
autovacuum_vacuum_threshold | 50
autovacuum_work_mem | -1
log_autovacuum_min_duration | -1
(13 rows)

pg_stat_progress_vacuum可以看到vacuum进行到那一步骤了。

以上是关于PG--vacuum概述的主要内容,如果未能解决你的问题,请参考以下文章

初级模拟电路:概述

Java面向对象概述

Azure Monitor概述

JavaMail入门第一篇 邮件简介及API概述

Servlet概述

Oracle体系概述