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.
的顺序扫描,它不会打扰您
我们正在使用 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.
的顺序扫描,它不会打扰您