我可以每1-2分钟运行一次PostgreSQL真空吸尘器吗?

Min*_*ice 4 postgresql performance mvcc vacuum

我正在考虑为即将到来的项目提供各种支持MVCC的数据库,PostgreSQL出现在我的雷达上.

我的程序的要求涉及大致如下的序列:

  1. 从当前版本的数据库中读取一些信息,修改80-90%的数据并将其写回一个或多个事务中(想象一下像是在Conway的生命游戏中更新网格,其中包括网格的新旧状态是必要的).

  2. 提交后等待1-2分钟.在此期间,客户端可以针对新数据发出读取.

  3. 重复.

数据库将限制为2-4GB.

~90%的更改是对现有对象的更新,~5%将是新对象,~5%将被删除对象.

所以我的问题是,我可以合理地每1-2分钟运行一次普通的VACUUM命令作为步骤1.5,并且让PostgreSQL能够跟上每次可能发生的2-3 + GB的更改吗?

man*_*iek 5

我相信Postgres应该在这种情况下做得很好.这种情况非常罕见,巨大更新之间的手动真空似乎是一个合理的选择.

考虑一下你是否可以做到这一点,以便不是大量的更新,而是生成一组新的表,分析它们(必要!),然后,利用事务ddl的功能,丢弃旧的表并将新的表重命名为它们的位置.这应该可以减轻您对VACUUM的担忧.

在这种情况下,你应该做一些认真的调整.特别是,请查看shared_buffers,与检查点相关的参数以及与真空相关的参数.另外,请记住使用实际工作负载进行基准测试.

  • 如果您为每个周期使用插入到新表中,请确保将单个事务重命名为"旧"名称并将新表重命名为使用中的表.在提交此事务和删除旧表之间留出一些时间,因为有一个小的时间窗口,其中使用旧表的OID计划的事务可能仍然在提交后执行.您可能希望使用"旧"表名的DROP TABLE IF EXISTS语句启动"将新事务移动到位"事务. (3认同)