【问题标题】:Space required for VACUUM FULL tableVACUUM FULL 表所需的空间
【发布时间】:2018-07-16 12:06:31
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: postgresql postgresql-10 vacuum


    【解决方案1】:

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

    VACUUM (FULL) 期间发生的情况是写入了表的新副本。 所有活动元组(= 行版本)和尚未删除的死元组都将写入此新副本。

    事务完成后,旧副本将被删除。

    【讨论】:

    • 感谢您的更正。因此,给定一个 1GB 表,其中包含 500MB 的活动行和 500MB 的死行,表上的 VACCUM FULL 将在将活动行复制到新表时增量分配空间,直到达到 500MB 时才完成?与分配 1GB 不同,复制活动行,然后返回任何多余的分配空间,在本例中为 500MB。
    • 未能在上方标记您
    • 非常有帮助的答案,您可以通过查询 pg_stat_user_tables(或 TOAST 的 dba.stackexchange.com/a/223225/94649 的情况下为 pg_stat_sys_tables)来检查有多少元组死亡。
    • @Thrasi 你理解正确。使用的磁盘空间不是预先分配的,而是随着新文件的写入而增加。
    【解决方案2】:

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

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

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

    【讨论】:

    • 推荐,因为如果最大的表只包含活动行,您需要那么多空间。但是,如果您知道最大的行包含大部分死行,那么您可能会侥幸逃脱,这就是我从中收集到的。
    • 是的,可能。如果您知道该表中存在多少活动数据,那么可用空间应该超过它。但是,如果该表中的活动数据的大小小于其他表中的数据,那么您还必须考虑它所需的空间。
    猜你喜欢
    • 2018-04-09
    • 1970-01-01
    • 2020-03-19
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多