0

试图让 Postgresql 保持表更清洁,但是即使在调整资源限制之后,它似乎也几乎没有跟上。

即使设置后

ALTER TABLE veryactivetable SET (autovacuum_vacuum_threshold = 10000);

veryactivetable 的 pg_stat_user_tables 返回 63356 n_dead_tup 并且 last_autoanalyze 和 last_autovacuum 超过 24 小时

posgresql.conf 设置:

shared_buffers = 7680MB
work_mem = 39321kB

maintenance_work_mem = 1920MB

vacuum_cost_delay = 0
vacuum_cost_page_hit = 1000
vacuum_cost_page_miss = 1000
vacuum_cost_page_dirty = 2000
vacuum_cost_limit = 7000


autovacuum = on
log_autovacuum_min_duration = 0
autovacuum_max_workers = 10
autovacuum_naptime = 10s
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50
autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.05
autovacuum_freeze_max_age = 200000000
autovacuum_vacuum_cost_delay = 50ms
autovacuum_vacuum_cost_limit = 7000
4

1 回答 1

0

autovacuum_vacuum_scale_factor和设置autovacuum_analyze_scale_factor为更高的值,最好恢复为默认值。无需让 autovacuum 运行得比必要的更频繁,尤其是在您的情况下。这个想法是让它一旦开始就快速完成。

设置autovacuum_naptime得更高,更接近一分钟的原始默认值。

autovacuum_max_workers除非你有很多数据库或很多表,否则恢复到 3。

为了使 autovacuum 尽快完成(这是目标),您应该做的是将设置autovacuum_vacuum_cost_delay为 0。

如果您只有几张非常繁忙的桌子,最好将其设置在您在问题中显示的那些桌子上。

于 2018-05-13T18:48:11.813 回答