我有一个表与文件和这个表的各种关系,文件存储为bytea
。我想释放旧文件占用的空间(根据时间戳),但行仍应存在于表中。
将null
设置为bytea
字段是否足够?是否会以这种方式从表中删除数据?
在PostgreSQL中,更新行会创建一个新的元组(行版本),而旧的元组将被autovacuum删除。
此外,较大的bytea
属性将存储在属于该表的TOAST表中的外部。
当你将bytea
属性设置为NULL(这是正确的做法)时,会发生两件事:
UPDATE
创建的所有新元组,主表将变得更大。 Autovacuum将释放空间,但不会缩小表(未来的数据修改可以重用空白空间)。所以你真正观察到的是,在UPDATE
之后,你的桌子比以前使用更多的空间。
您可以通过在表上运行VACUUM (FULL)
来摆脱所有空白区域,但这将阻止在操作期间对表的并发访问,因此准备安排一些停机时间(您可能会为UPDATE
执行此操作)无论如何)。