0

我们正在使用 Postgres 存储约 2.000.000.000 个样本。这最终出现在具有约 500 个 mio 条目和约 100GB 大小的表中。

我想要做什么:例如更新表格条目:UPDATE table SET flag = true;

在此之后,表是原来的两倍,即 200GB 为了取回空间(存储在 SSD 上),我们:“VACCUM FULL table”

不幸的是,此步骤再次需要大量空间,导致真空由于剩余空间太少而失败。

我的问题: 这是否意味着,为了只进行一次 UPDATE 查询并为该数据库中的其他表取回空间,我们需要至少 300-400GB 的空间用于 100GB 表?

4

1 回答 1

1

在您的场景中,如果没有至少两倍于表数据所需的空间,您将无法逃脱。

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

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

这种方法的缺点是表总是两倍于必要的大小,并且所有顺序扫描将花费两倍的时间。如果您不使用表的顺序扫描,它不会打扰您。

于 2017-03-09T09:10:45.213 回答