大规模删除后的PostgreSQL剩余空间

51

我有一个拥有九百万行的表。我发现其中大量(约90%)可以被释放。清理后需要哪些操作?是Vacuum、重新索引等。


什么是PostgreSQL版本?另外,如果解决了您的问题,请接受答案。 - intgr
4个回答

65

如果你想在文件系统上释放空间,可以使用VACUUM FULLCLUSTER。在运行这些操作之后,您可能还想运行ANALYZE,以确保查询规划器具有最新的统计信息,但这并非必须。

需要注意使用VACUUM FULL会在表上放置ACCESS EXCLUSIVE锁(阻止任何操作,包括写入和读取),因此您可能需要让应用程序在此期间下线。

在 PostgreSQL 8.2及更早版本中,VACUUM FULL可能是最好的选择。

在PostgreSQL 8.3和8.4中,CLUSTER命令得到了显着改进,因此不推荐使用VACUUM FULL--它很慢并且会使索引膨胀。相比之下,`CLUSTER将从头开始重新创建索引,没有膨胀。在我的经验中,通常也要快得多。CLUSTER还将使用索引对整个实际表进行排序,因此必须选择一个索引。如果您不知道哪个,主键将很好地工作。

在PostgreSQL 9.0中,VACUUM FULL被更改为像CLUSTER一样工作,因此两者都很好。

很难做出预测,但在经过适当的调整并使用普通硬件的服务器上,900万行不应该需要超过20分钟。


当可用空间较少时,我们能否执行此操作?比如说,从10GB分区中已使用了9GB空间,只剩下不到1GB的可用空间。我们能否简单地删除记录并运行VACUUM FULL? - Yasiru G
2
@YasiruG 很不幸,这些操作会创建一个完整的新表副本,因此如果该表(不包括已删除行)大于1GB,则会失败。您可以删除并重新创建索引以暂时释放空间。另一种选择是将此表的pg_dump转储到单独的机器或磁盘上,然后删除表并还原它 - 这将像VACUUM一样释放空间。 - intgr

30

你肯定想运行VACUUM,以释放未来插入所需的空间。如果你想要真正回收磁盘上的空间,使其可用于操作系统,则需要运行VACUUM FULL。请注意,VACUUM可以并发运行,但是VACUUM FULL需要锁定表的排他锁。

在VACUUM运行后,索引仍将保持膨胀状态,因此您还需要REINDEX。如果可能,更快的方法是删除索引并从头开始创建它。

您还需要进行ANALYZE,这可以与VACUUM一起进行。

有关更多信息,请参见文档


我在想,为什么删除并重新创建索引会更快?根据我所看到的(也许不完全正确),当你重新索引时会创建一个新的索引并替换旧的索引,不应该更快吗? - Dmitry Polovinkin

4

你觉得使用一个有10%所需记录的临时表是否更加优化?然后删除原始表并将临时表重命名为原始表...


1

我对Postgres的世界相对较新,但我了解到VACUUM ANALYZE是推荐的。我认为还有一个子选项只是释放空间。当进行批量插入或删除时,我也发现重新索引很有用。是的,我一直在使用具有类似行数的表格,速度的提升非常明显(UBuntu,Core 2 Quad)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接