PostgreSQL drop table命令不会减少DB大小

时间:2013-09-24 22:27:51

标签: sql postgresql postgresql-9.1 postgresql-9.2 postgresql-8.4

我从Postgres数据库中删除了几张表。但是,在删除表之前,数据库的大小为6586kB,并且在删除数据库的表大小之后保持不变。我认为应该减少尺寸。

要获得实际尺寸,我需要做什么?

我知道VACUUM命令。我需要使用它吗?如何?

3 个答案:

答案 0 :(得分:4)

在这种情况下,

VACUUM(或VACUUM FULL)几乎没用,因为它只从表中的中回收空间。

好吧,目录表中的条目会在删除表后留下死元组。因此,在创建表并再次删除表之后,数据库可以占用更多的空间。

要再次将数据库降至最小,请运行客户端工具vacuumdb with the --full option

vacuumdb -f mydb

在Postgres 9.0或更高版本上,这也会在prestine条件下重写索引。 Postgres Wiki中的详细信息: http://wiki.postgresql.org/wiki/VACUUM_FULL

这就是Postgres测量db大小的方式:使用专用的object size functions

SELECT pg_size_pretty(pg_database_size(mydb));

答案 1 :(得分:3)

使用truncate,首先了解有关MVCC的警告

  

TRUNCATE会快速删除一组表中的所有行。它与每个表上的非限定DELETE具有相同的效果,但由于它实际上不扫描表,因此速度更快。此外,它立即回收磁盘空间,而不是需要后续的VACUUM操作。这对大型表格最有用。

http://www.postgresql.org/docs/9.1/static/sql-truncate.html

答案 2 :(得分:1)

6586KB大约是“空”(新创建的)数据库的大小。如果您丢弃的表格非常小​​或为空,那么丢弃它们不会减小大小(如果有的话)。

当我删除一个填充的大表时,数据库大小的减少(如psql的“\ l +”命令所示)会立即反映出来,不需要真空或检查点。