一、autovacuum引入
vacuum 可以清理死元组,但多久调用一次vacuum是很难界定的,对于频繁更新的表,我们需要及时的vacuum,避免积累过多的死元组而致使数据库性能下降,而且死元组过多的积累必将导致下次vacuum执行缓慢;另外,如果表不频繁更新,而频繁的执行vacuum会造成不必要的资源浪费,为此PostgreSQL引入autovacuum机制,由postmaster 拉起一个单独的进程autovacuum来根据表的死元组的阈值来自动vacuum。
[pg14@test ~]$ ps -ef | grep postgres
pg14 24216 1 0 02:36 ? 00:00:00 /app/pg14/bin/postgres -D /data/pg14
pg14 24218 24216 0 02:36 ? 00:00:00 postgres: checkpointer
pg14 24219 24216 0 02:36 ? 00:00:00 postgres: background writer
pg14 24220 24216 0 02:36 ? 00:00:00 postgres: walwriter
pg14 24221 24216 0 02:36 ? 00:00:00 postgres: autovacuum launcher <<<<<<<<<
pg14 24222 24216 0 02:36 ? 00:00:00 postgres: stats collector
pg14 24223 24216 0 02:36 ? 00:00:00 postgres: logical replication launcher
pg14 28979 28798 0 09:14 pts/0 00:00:00 grep --color=auto postgres
二、autovacuum工作机制
1.autovacuum和手动vacuum的不同
- autovacuum在清理完死元组之后会自动执行analyze
- autovacuum可能是多个worker并行工作的,一个worker的工作内存就可以达到maintenance_work_mem的设定值,因此如果maintenance_work_mem设定的值很大,多个autovacuum worker并行执行会消耗很大内存,为此PostgreSQL提供专门的参数autovacuum_work_mem来限定每个worker可使用的做大内存。
- auotvacuum不允许属于同一表的多个索引并行执行
2.autovacuum相关参数
postgres=# 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 | 200 000 000
autovacuum_max_workers