从 table 中清理文件而不删除 postgresql 9.6.3 中的行

Cleaning up files from table without deleting rows in postgresql 9.6.3

我有一个 table,其中包含文件以及与此 table 的各种关系,文件存储为 bytea。我想释放 space 被旧文件占用的空间(根据时间戳),但是这些行仍应存在于 table.

设置nullbytea字段就够了吗? table 这样真的会删除数据吗?

在 PostgreSQL 中,更新一行会创建一个新的 tuple(行版本),而旧的将被 autovacuum 删除。

此外,较大的 bytea 属性将被离线存储在属于 table.

TOAST table 中

当您将 bytea 属性设置为 NULL(这是正确的做法)时,会发生两件事:

  • 由于 UPDATE 创建的所有新元组,主 table 将变得 更大 。 Autovacuum 将释放 space,但不会收缩 table(空的 space 可以在未来的数据修改中重新使用)。

  • TOAST table 中的条目将被删除。同样,autovacuum 将释放 space,但 table 不会缩小。

所以您实际观察到的是,在 UPDATE 之后,您的 table 使用 比之前 更多 space。

您可以通过 运行 VACUUM (FULL) 在 table 上删除所有空的 space,但这会阻止对 table 的并发访问在操作期间,请准备好安排一些停机时间(您可能会在 UPDATE 期间这样做)。