我的PostgreSQL DB模式上有一个名为EVENTS的表。
它是空的,即当我执行
SELECT * FROM EVENTS我得到一个空的结果集。
尽管如此,该表还是占用了5MB的磁盘空间。
我在执行
SELECT round(pg_total_relation_size('events') / 1024.0 / 1024.0, 2)我得到了5.13MB的内存。
我试图显式地运行VACUUM,但它没有改变任何事情。
有什么想法吗?
发布于 2015-07-15 02:57:00
截断表:
truncate events;TRUNCATE可快速删除一组表中的所有行。它与对每个表的非限定DELETE具有相同的效果,但由于它实际上不扫描表,因此速度更快。此外,它可以立即回收磁盘空间,而不需要后续的真空操作。这在大表上最有用。
如果希望立即回收磁盘空间,并保留非空表的现有行,则可以使用vacuum:
vacuum full events;这将以独占方式锁定表并重写它(实际上,会创建一个新副本并删除旧副本)。这是一个开销很大的操作,通常不推荐在较大的表上执行。
在RDBMS中,磁盘空间的一些冗余使用是一种正常状态。如果您有一个正确配置的autovacuum daemon,则在插入新行时将使用未使用的空间。
发布于 2015-07-16 07:54:02
如果您的表中有死行或膨胀,VACUUM实际上不会回收其内存,而是使其可重用,这将在您下次向表中插入数据时使用。
要回收使用的内存,请尝试
真空满事件;
https://stackoverflow.com/questions/31414050
复制相似问题