加速PG中vacuum
一旦VACUUM进程发起后,VACUUM大表能加速吗?
简而言之,一旦vacuum开始工作,就不可能影响它的速度。主要原因是,这个进程大部分资源用于磁盘操作,这些操作速度不是太快。此外,仍然要为常规数据库进程留有足够的资源。考虑到这一点,改变一些系统参数可以允许单独的VACUUM工作进程加快其性能。
为此,需要配置相当“激进”的配置。这样VACUUM进程可以更加频繁发起,但随着每次启动,这些进程需要更少操作,从而减少总体工作时间。
下面是AUTOVACUUM参数的配置:
1)配置合适的autovacumm_max_workers(默认值3,这个值较低,因此10左右比较合适)
2)增加AUTOVACUUM检查发起的频率(autovacuum_naptime=1s,默认值是1分钟)
3)降低自动触发AUTOVACUUM发起的阈值。(autovacuum_vacuum_threshold=50
,autovacuum_analyze_threshold=10,autovacuum_vacuum_scale_factor=0.05,
autovacuum_analyze_scale_factor=0.05)
4)降低触发FREEZE的阈值(autovacuum_freeze_min_age=5000000, vacuum_freeze_table_age=15000000)
autovacuum_max_workers需要服务重启后生效,其他参数不需要。使用上述参数将增加AUTOVACUUM访问表的频率,同时将工作分解为更小部分。从而VACUUM将需要降低的工作量份额,并反过来加快整体命令的执行。
另外,一个更加“激进”的参数值可用于VACUUM命令(vacuum_cost_delay=0, vacuum_cost_page_hit=0, vacuum_cost_page_miss=1, vacuum_cost_page_dirty=10, vacuum_cost_limit=100)。这允许VACUUM利用更多资源,而牺牲其他服务进程,并降低了服务工作负载之间的暂停限制。
原文
https://dataegret.com/2022/01/accelerating-vacuum-in-postgres/