我有一个问题的自动真空-我有几个大表(超过1000万条记录)是非常频繁地更新(500次每秒更新)。一切正常,直到膨胀发生为止:)
正如我所看到的,有些表在超过10分钟的时间内是不自动空出的,而在这段时间内,会生成许多死元组,这些元组会破坏性能。
那么,我的问题是-自动真空过程的流程是什么?例如,如果我有10个应该真空的表(在这些表上达到了自动真空阈值),Postgres真空表是一个接一个地进行,还是会平行地对所有的表进行真空?我在官方文件里找不到那个信息。另一个问题-- Postgres会在每个数据库中产生单个自动真空工作人员吗?如果我只有一个数据库,那么我不需要更改"autovacuum_max_workers“参数?
我已经更改了以下自动真空配置参数:
除此之外,我还在大桌子上配置了自动真空阈值(因为1% od 1千万是100 k):
发布于 2019-03-14 16:17:33
如果只有一个数据库需要注意,那么直到autovacuum_max_workers都会在该数据库中启动。但是,autovacuum_naptime需要几段时间才能将它们全部发射。在给定的时间里,每个人都需要一张不同的桌子来处理。
然而,这可能没有您想要的效果,因为IO节流阈值将在它们之间被划分。这意味着,虽然多个表是并行清空的,但当打开IO节流时,增加autovacuum_max_workers数并不会提高清空的总体速度。使用更高的autovacuum_max_workers值的目的是确保如果所有的工作人员(可能较低的最大值)都被大型表单独固定,那么小表不会被完全忽略。
如果您担心autovac的工作速度不够快,我只会选择大型机和set autovacuum_vacuum_cost_delay = 0,以便关闭IO节流和set log_autovacuum_min_duration = 0,这样您就可以看到正在发生的事情了。这应该会很快给你一个明确的答案。相对于渐进式改变autovacuum_vacuum_cost_limit,它将缓慢地给出不明确的答案。
https://dba.stackexchange.com/questions/232119
复制相似问题