我的 Postgres 数据库中有一个execution_transcripts
包含多列的大表。其中两列是 JSONB 列,task
其result
值通常在千字节范围内,有时在兆字节范围内。
这个表变得太大了,我们正在制定策略来减小它的尺寸。
具体来说,SELECT pg_total_relation_size('treeline_schema.execution_transcript')
返回22528457179136
大约 20 TB。
作为一项实验,在我们生产数据库的副本上,我运行了以下查询以将底部 2000 行中的这两列清零:
UPDATE execution_transcript
SET result = NULL, task = NULL
WHERE id <= 2000 and id > 0;
完成此操作后,我发现总关系大小增加了319.4 kb 22528457498624
。
这是因为我所做的只是将新值附加到日志中,而一些后续的压缩过程将来会缩小关系大小吗? 如果我想看到表的占用空间缩小,是否需要采取其他步骤?
Postgres 使用 MVCC,它的实现意味着当您在 PostgreSQL 中更新一行时,它会在内部创建该行的全新副本。这是因为其他长期运行的事务可能需要该行的“旧版本”。但是,很快,就没有什么需要这些旧副本了,它们就变成了“死”元组。
删除这些死元组是 PostgreSQL 的 Vacuuming(和 Autovacuuming)进程的工作。