我正在考虑为即将到来的项目提供各种支持MVCC的数据库,PostgreSQL出现在我的雷达上。
我的程序要求涉及大致如下的序列:
从当前版本的数据库中读取一些信息,修改80-90%的数据并将其写回一个或多个交易中(想象一下像是在Conway的生命游戏中更新网格并且需要新的网格状态。)
提交后等待1-2分钟。在此期间,客户可以针对新数据发布读取。
重复。
数据库将限制为2-4GB。
~90%的更改是对现有对象的更新,~5%将是新对象,~5%将被删除对象。
所以我的问题是,我可以合理地每1-2分钟运行一次普通的VACUUM命令作为步骤1.5,并且让PostgreSQL能够跟上每次可能发生的2-3 + GB的更改吗?
答案 0 :(得分:5)
我相信Postgres应该在这种情况下做得很好。这种情况非常罕见,巨大更新之间的手动真空似乎是一个合理的选择。
考虑一下你是否可以这样做而不是大量的更新,你生成一组新的表,分析它们(必要!),然后,用事务ddl的力量,删除旧的表并重命名新表到他们的位置。这应该可以减轻您对VACUUM的担忧。
在这种情况下,你应该做一些认真的调整。特别是,请查看shared_buffers,与检查点相关的参数以及与真空相关的参数。另外,请记住使用实际工作负载进行基准测试。