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概述的主要内容,如果未能解决你的问题,请参考以下文章