相关疑难解决方法(0)

PostgreSQL 上的主动式自动清理

我试图让 PostgreSQL 积极地自动清空我的数据库。我目前已按如下方式配置自动真空吸尘器:

  • autovacuum_vacuum_cost_delay = 0 #关闭基于成本的真空
  • autovacuum_vacuum_cost_limit = 10000 #最大值
  • autovacuum_vacuum_threshold = 50 #默认值
  • autovacuum_vacuum_scale_factor = 0.2 #默认值

我注意到自动真空仅在数据库未加载时才会启动,因此我遇到死元组比活元组多得多的情况。有关示例,请参阅随附的屏幕截图。其中一张表有 23 个活动元组,但有 16845 个死元组等待真空。这太疯狂了!

很多死元组

当测试运行完成并且数据库服务器空闲时,自动真空开始,这不是我想要的,因为我希望自动真空在死元组数量超过 20% 活元组 + 50 时启动,因为数据库已经配置。服务器空闲时的自动真空对我来说是无用的,因为生产服务器预计会在持续时间内达到 1000 次更新/秒,这就是为什么即使服务器负载不足我也需要自动真空运行。

有什么我想念的吗?如何在服务器负载较重时强制运行自动吸尘器?

更新

这可能是一个锁定问题吗?有问题的表是通过插入后触发器填充的汇总表。这些表以 SHARE ROW EXCLUSIVE 模式锁定,以防止并发写入同一行。

postgresql performance vacuum performance-testing

46
推荐指数
5
解决办法
5万
查看次数