开启autovacuum的前提条件是打开track_counts。因为系统需要根据跟踪到的tuples计数和阀值进行比较来决定是否出发autovacuum 或 autoanalyze
- autovacuum 是否开启自动vacuum, analyze.
- log_autovacuum_min_duration 阀值,用于度量是否需要记录下autovacuum的动作到log里面.(-1表示禁止,0表示记录所有)
- autovacuum_max_workers 用于指定整个数据库机器同一时间点允许的autovacuum后台进程(不包括lanucher进程)
- autovacuum_naptime 两个autovacuum或autoanalyze允许周期间的间隔时间。为了看效果,我们在下面的例子把这个值设置为1S。
- autovacuum_vacuum_threshold 最小触发vacuum的度量值(计数器记录update,delete的tuples)
- autovacuum_analyze_threshold 最小触发analyze的度量值(计数器记录insert,update,delete的tuples)
- autovacuum_vacuum_scale_factor 当前reltuples乘以autovacuum_vacuum_scale_factor
- autovacuum_analyze_scale_factor 当前reltuples乘以autovacuum_analyze_scale_factor (注意autovacuum和autoanalyze是分别计数的,不要混淆)
假设x为update的tuples计数值,y为delete的tuples计数值. 假设a为update的tuples计数值,b为delete的tuples计数值,c为insert的tuples计数值.
何时发生autoanalyze ? (a+b+c) > (autovacuum_analyze_threshold * reltuples + autovacuum_analyze_threshold)
何时发生autovacuum ? (x+y) > (autovacuum_vacuum_scale_factor * reltuples + autovacuum_vacuum_threshold)
(reltuples: select reltuples from pg_class where relname = )
(x, a: select n_tup_upd from pg_stat_all_tables where relid='yyy'::regclass;) (y, b: select n_tup_del from pg_stat_all_tables where relid='yyy'::regclass;) (c: select n_tup_ins from pg_stat_all_tables where relid='yyy'::regclass;)