4

我正在为即将到来的项目考虑各种支持 MVCC 的数据库,而 PostgreSQL 引起了我的注意。

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

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

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

  3. 重复。

数据库将被限制为 2-4GB。

约 90% 的更改是对现有对象的更新,约 5% 将是新对象,约 5% 将是删除对象。

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

4

1 回答 1

5

我相信 Postgres 在这种情况下应该做得很好。这种情况并不常见,以至于在大量更新之间进行手动真空似乎是一个合理的选择。

考虑是否可以这样做,而不是进行大量更新,而是生成一组新表,分析它们(必要!),然后借助事务性 ddl 的力量,删除旧表并将新表重命名到它们的位置. 这应该可以减轻您对 VACUUM 的担忧。

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

于 2012-03-13T23:40:17.570 回答