从 table 中清理文件而不删除 postgresql 9.6.3 中的行
Cleaning up files from table without deleting rows in postgresql 9.6.3
我有一个 table,其中包含文件以及与此 table 的各种关系,文件存储为 bytea
。我想释放 space 被旧文件占用的空间(根据时间戳),但是这些行仍应存在于 table.
设置null
到bytea
字段就够了吗? 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
期间这样做)。
我有一个 table,其中包含文件以及与此 table 的各种关系,文件存储为 bytea
。我想释放 space 被旧文件占用的空间(根据时间戳),但是这些行仍应存在于 table.
设置null
到bytea
字段就够了吗? table 这样真的会删除数据吗?
在 PostgreSQL 中,更新一行会创建一个新的 tuple(行版本),而旧的将被 autovacuum 删除。
此外,较大的 bytea
属性将被离线存储在属于 table.
当您将 bytea
属性设置为 NULL(这是正确的做法)时,会发生两件事:
由于
UPDATE
创建的所有新元组,主 table 将变得 更大 。 Autovacuum 将释放 space,但不会收缩 table(空的 space 可以在未来的数据修改中重新使用)。TOAST table 中的条目将被删除。同样,autovacuum 将释放 space,但 table 不会缩小。
所以您实际观察到的是,在 UPDATE
之后,您的 table 使用 比之前 更多 space。
您可以通过 运行 VACUUM (FULL)
在 table 上删除所有空的 space,但这会阻止对 table 的并发访问在操作期间,请准备好安排一些停机时间(您可能会在 UPDATE
期间这样做)。