> autovacuum_vacuum_cost_delay = 0#关闭基于成本的真空
> autovacuum_vacuum_cost_limit = 10000 #Max值
> autovacuum_vacuum_threshold = 50 #Default值
> autovacuum_vacuum_scale_factor = 0.2 #Default值
我注意到,当数据库没有负载时,自动真空只会启动,因此我会遇到死元组比实时元组多得多的情况.请参阅附带的屏幕截图以获取示例.其中一个表有23个实时元组,但有16845个死元组等待真空.那太疯狂了!
当测试运行完成并且数据库服务器空闲时,自动真空启动,这不是我想要的,因为每当死元组的数量超过20%的实时元组50时,我希望自动真空启动,因为数据库已经配置.服务器空闲时的自动真空对我来说是无用的,因为生产服务器预计会在一段持续时间内达到1000次更新/秒,这就是为什么即使服务器负载也需要自动真空运行的原因.
有什么我想念的吗?在服务器负载很重的情况下,如何强制自动真空运行?
更新
这可能是锁定问题吗?有问题的表是汇总表,通过后插入触发器填充.这些表在SHARE ROW EXCLUSIVE模式下被锁定,以防止并发写入同一行.
然而,对于后代,我想给出超级激进的autovacuum的一组示例设置,因为你提供的设置并不完全如此.但请注意,使autovacuum更具攻击性不太可能解决您的问题.另请注意,默认的autovacuum设置基于使用DBT2运行超过200次测试运行,寻求最佳的设置组合,因此默认值应该被认为是好的,除非你有充分的理由不这么认为,或者除非你的数据库明显在外面OLTP数据库的主流(例如,每秒获得10K更新的小型数据库,或3TB数据仓库).
首先,打开日志记录,以便检查autovacuum是否正在执行您认为的操作:
log_autovacuum_min_duration = 0
然后让我们制作更多autovac工作者并让他们更频繁地检查表格:
autovacuum_max_workers = 6 autovacuum_naptime = 15s
autovacuum_vacuum_threshold = 25 autovacuum_vacuum_scale_factor = 0.1 autovacuum_analyze_threshold = 10 autovacuum_analyze_scale_factor = 0.05
然后让我们使autovacuum更容易中断,因此它的完成速度更快,但代价是对并发用户活动产生更大的影响:
autovacuum_vacuum_cost_delay = 10ms autovacuum_vacuum_cost_limit = 1000
这是针对一般攻击性autovacuum的完整程序,这可能适用于小型数据库获得非常高的更新率,但可能对并发用户活动产生太大影响.
另外,请注意autovacuum parameters can be adjusted per table,这对于需要调整autovacuum的行为几乎总是更好的答案.
但是,再一次,它不太可能解决您的真正问题.