【发布时间】:2012-03-30 09:19:57
【问题描述】:
我正在为即将到来的项目考虑各种支持 MVCC 的数据库,而 PostgreSQL 引起了我的注意。
我的程序的需求大概是这样的:
从当前版本的数据库中读取一些信息,修改 80-90% 的数据并在一个或多个事务中将其写回(想象一下更新 Conway 的生命游戏中的网格,其中旧的并且需要新的网格状态)。
提交后等待 1-2 分钟。在此期间,客户端可以针对新数据发出读取。
重复。
数据库将被限制为 2-4GB。
~90% 的更改是对现有对象的更新,~5% 将是新对象,~5% 将是删除对象。
所以我的问题是,我是否可以合理地每 1-2 分钟运行一次简单的 VACUUM 命令作为步骤 1.5,并让 PostgreSQL 能够跟上每次可能进行的 2-3+GB 的更改?
【问题讨论】:
-
您可能不需要手动运行它。调整该特定表的自动真空设置就足够了。但是只有在删除或插入大量行时才真正需要真空。更新不需要如此激进的真空。
-
我的理解是每次更新都会生成一个带有新 XID 的新记录,并且由于每个周期我会更新 80-90% 的对象,我希望有很多“旧”记录清理。
-
可能还需要注意的是,在第 1 步运行时,客户端也可能会从第“0”步对数据库的“旧”状态发出读取,因此这些旧记录需要在生成新的时可用。
-
@MindJuice:你说得对,更新会留下死元组。但是 Postgres 可以通过 HOT ("heap-only Tuple") updates 重复使用该空间而无需清理。一些例外情况适用 - 特别是如果索引列在更新中发生更改。换个说法,出于好奇:您还想到了哪些其他 MVCC 数据库?
-
由于您在每次传递中都进行大量更新,因此可能值得使用稀疏的 fillfactor 创建表,以便在每个堆页面中为 HOT 更新留出足够的空间。跨度>
标签: performance postgresql vacuum mvcc