清除表中的文件而不删除postgresql 9.6.3中的行

问题描述 投票:1回答:1

我有一个表与文件和这个表的各种关系,文件存储为bytea。我想释放旧文件占用的空间(根据时间戳),但行仍应存在于表中。

null设置为bytea字段是否足够?是否会以这种方式从表中删除数据?

postgresql postgresql-9.6
1个回答
1
投票

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

此外,较大的bytea属性将存储在属于该表的TOAST表中的外部。

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

  • 由于UPDATE创建的所有新元组,主表将变得更大。 Autovacuum将释放空间,但不会缩小表(未来的数据修改可以重用空白空间)。
  • TOAST表中的条目将被删除。再次,autovacuum将释放空间,但表不会缩小。

所以你真正观察到的是,在UPDATE之后,你的桌子比以前使用更多的空间。

您可以通过在表上运行VACUUM (FULL)来摆脱所有空白区域,但这将阻止在操作期间对表的并发访问,因此准备安排一些停机时间(您可能会为UPDATE执行此操作)无论如何)。

© www.soinside.com 2019 - 2024. All rights reserved.