从文档:
在 PostgreSQL 中,行的 UPDATE 或 DELETE不会立即删除该行的旧版本 [...] 但最终,任何事务都不再对过时或已删除的行版本感兴趣。然后必须回收它占用的空间以供新行重用,以避免磁盘空间需求的无限增长。这是通过运行 VACUUM来完成的。
当真空运行时,它是否通过重写整个块有效地释放已删除行占用的空间,或者只有当新行小于为它们让路的已删除行时才会出现块碎片,新行适合可用的“洞” ?
从文档:
在 PostgreSQL 中,行的 UPDATE 或 DELETE不会立即删除该行的旧版本 [...] 但最终,任何事务都不再对过时或已删除的行版本感兴趣。然后必须回收它占用的空间以供新行重用,以避免磁盘空间需求的无限增长。这是通过运行 VACUUM来完成的。
当真空运行时,它是否通过重写整个块有效地释放已删除行占用的空间,或者只有当新行小于为它们让路的已删除行时才会出现块碎片,新行适合可用的“洞” ?
VACUUM 重写整个块,有效地打包剩余的行并留下一个连续的空闲空间块(尽管这个空间没有归零,并且物理磁盘文件可能包含已删除行的剩余部分,当然这些剩余部分对数据库用户)。
测试架构:
表支持文件的物理内容:
删除和真空:
表支持文件的物理内容:
插入新行:
表支持文件的最终物理内容:
清理: