Postgres:我们是否总是需要至少释放最大 table 的 space 的 3-4 倍?

Postgres: Do we always need at least 3-4 times free the space of the biggest table?

我们正在使用 Postgres 存储约 2.000.000.000 个样本。这在 table 秒内结束,每个 table.

有 ~ 500 个 mio 条目和 ~100GB 大小

我想做的事情: 例如。更新 table 条目:UPDATE table SET flag = true;

在此之后,table 是两倍大,即 200GB 要取回 space(存储在 SSD 上),我们:"VACCUM FULL table"

不幸的是,此步骤需要再次加载 space,这导致 Vacuum 由于剩余的 space 太少而失败。

我的问题: 这是否意味着,为了仅进行一次更新查询并为该数据库中的其他 table 取回 space,我们至少需要 300-400GB space 对于 100GB table?

在您的场景中,如果 space 的数量至少是 table 数据所需的两倍,您就无法逃脱。

成本最低的解决方案可能是定义 table 的 fillfactor 为 50,这样每个块的一半留空,从而使 table 大小加倍。然后更新的行都可以与原始行位于同一块中,并且 UPDATE 不会增加 table 大小,因为 PostgreSQL 只能使用 堆元组 (热)更新功能。如果没有长时间的 运行 事务仍然可以看到它们,旧版本将立即被释放。

注意: 这仅在您更新的列 索引时有效。

这种方法的缺点是 table 总是必要大小的两倍,所有顺序扫描将花费两倍的时间。如果您不使用 table.

的顺序扫描,它不会打扰您