VACUUM FULL 表所需的空间

Thr*_*asi 13 postgresql vacuum postgresql-10

来自关于完全真空的 PostgreSQL 10.4 手册:

请注意,它们还会临时使用大约等于表大小的额外磁盘空间,因为在新表和索引完成之前无法释放表和索引的旧副本

我在很多不同的地方读过这篇文章,并以各种方式表达过。一些表明所需的空间最多等于真空表的大小。暗示它可能只需要足够的空间来存储生成的真空表,即大小在 [0-size_of_original_table] 范围内,具体取决于表中有多少死行。

我的问题是:对表进行完全真空是否总是需要等于原始表大小的空间,还是取决于表中的活动行数?

Lau*_*lbe 14

所需的额外空间VACUUM (FULL)取决于表中的活动行数。

在此期间发生VACUUM (FULL)的是写入表的新副本。所有活着的元组(= 行版本)和还不能被删除的死元组都将被写入这个新副本。

交易完成后,旧副本将被删除。

  • 感谢您的更正。那么给定一个 1GB 的表,其中有 500MB 的活动行和 500MB 的死行,表上的 VACCUM FULL 将在将活动行复制到新表的同时递增分配空间,直到达到 500MB 时完成?与分配 1GB 不同,复制活动行然后返回任何多余的分配空间,在本例中为 500MB。 (2认同)

小智 8

建议空闲空间至少等于数据库中最大表的大小。

即,如果您的数据库大小为 10GB,而您数据库中的最大表大小为 2GB。那么你的磁盘上必须至少有 2GB 的额外空间,才能成功完成真空。

因为VACUUM FULL将创建表的新副本,排除死行然后删除现有表。

  • 推荐因为如果最大的表只包含活动行,您需要那么多空间。但是如果你知道你最大的包含大部分死行,你可能会得到更少的东西,这是我从中收集到的。 (2认同)