我从我的 Postgres 数据库中删除了几个表。但是,在删除表之前,数据库的大小为 6586kB,在删除表之后,数据库的大小保持不变。我认为尺寸应该减小。
我需要做什么才能获得实际尺寸?
我知道 VACUUM 命令。我需要使用它吗?如何?
我从我的 Postgres 数据库中删除了几个表。但是,在删除表之前,数据库的大小为 6586kB,在删除表之后,数据库的大小保持不变。我认为尺寸应该减小。
我需要做什么才能获得实际尺寸?
我知道 VACUUM 命令。我需要使用它吗?如何?
VACUUM
(or VACUUM FULL
) 在这种情况下几乎没有用,因为它只从表中回收空间。删除表后都不需要。每个表(和索引)都作为单独的文件存储在操作系统中,该文件与表一起被删除。所以空间几乎立即被回收。
好吧,目录表中有条目会在删除表后留下死元组。因此,在创建并再次删除表后,数据库可以占用稍多的空间。
要再次将数据库缩小到最小大小,请运行(作为特权用户):
VACUUM FULL;
如果没有表列表,所有可访问的表都会被重写为原始状态。(不建议用于并发负载的大型数据库,因为它需要独占锁!)
vacuumdb
或带有--full
选项的客户端工具:
vacuumdb -f mydb
这也会在原始状态下重写系统目录(也是表)和索引。Postgres Wiki 中的详细信息:
Postgres 有专门的对象大小函数来测量数据库大小:
SELECT pg_size_pretty(pg_database_size(mydb));
使用truncate,先了解MVCC的警告
TRUNCATE 从一组表中快速删除所有行。它与每个表上的非限定 DELETE 具有相同的效果,但由于它实际上并不扫描表,因此速度更快。此外,它会立即回收磁盘空间,而不需要后续的 VACUUM 操作。这在大表上最有用。
6586KB 大约是一个“空”(新创建的)数据库的大小。如果您删除的表非常小或为空,则删除它们不会大大减少大小(如果有的话)。
当我删除一个填充的大表时,数据库大小的减少(如 psql 的“\l+”命令所见)几乎是瞬间反映的,不需要真空或检查点。