gpt4 book ai didi

postgresql - Postgres Vacuum 不释放空间

转载 作者:行者123 更新时间:2023-11-29 11:32:34 26 4
gpt4 key购买 nike

我的数据库中有一张表占用了 161GB 的硬盘空间。 200Gb 硬盘只剩下 5GB 可用空间。

  1. 以下命令显示我的表占用了 161GB 硬盘空间,
    选择 pg_size_pretty(pg_total_relation_size('Employee'));

  2. 表中有将近 527 行。现在我删除了 250 行。我再次检查了 Employee 的 pg_total_relation_size。大小仍然是 161GB。

  3. 看到上述查询的输出后,我运行了 vacuum 命令:
    VACUUM VERBOSE ANALYZE Employee;

  4. 我检查了 VACUUM 是否真的发生了,
    SELECT relname, last_vacuum, last_autovacuum FROM pg_stat_user_tables;我可以看到上次清理时间与我运行 VACUUM 命令的时间相匹配。

  5. 我还运行了下面的命令来查看是否有死元组,
    SELECT relname, n_dead_tup FROM pg_stat_user_tables;Employee 表的 n_dead_tup 计数为 0。

  6. 如果我运行上述所有这些命令后,
    选择 pg_size_pretty(pg_total_relation_size('Employee'));它仍然显示 161GB。

我可以知道这背后的原因吗?也请纠正我如何释放 interface_list。

最佳答案

vacuum 并不是在物理上“释放”空间。它仅将不再使用的空间标记为可重复使用。因此后续的 UPDATE 或 INSERT 语句可以使用该空间而不是追加到表中。

Quote from the manual

The standard form of VACUUM removes dead row versions in tables and indexes and marks the space available for future reuse. However, it will not return the space to the operating system, except in the special case where one or more pages at the end of a table become entirely free and an exclusive table lock can be easily obtained

(强调我的)

如果您重新插入 250 行已删除的行,您将看到该表不再增长,因为新插入的行仅使用由 vacuum 标记为空闲的空间。

如果您真的想在物理上将表的大小减小到“需要”的大小,则需要运行 vacuum full

Quote from the manual

VACUUM FULL actively compacts tables by writing a complete new version of the table file with no dead space. This minimizes the size of the table, but can take a long time. It also requires extra disk space for the new copy of the table, until the operation completes

(强调我的)

关于postgresql - Postgres Vacuum 不释放空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51204561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com