大量postgres删除后的自由空间

时间:2011-03-16 15:54:54

标签: database postgresql

我有一张900万行表。我发现可以释放大量的(大约90%)。清理后需要采取什么行动?真空,重新索引等。

提前致谢。

4 个答案:

答案 0 :(得分:39)

如果您想释放文件系统上的空间,VACUUM FULL或CLUSTER可以为您提供帮助。您还需要在这些之后运行ANALYZE,以确保规划器具有最新的统计信息。在此过程中,您的表将被完全锁定(此表上的读取和写入将挂起),因此您可能希望在一段时间内使应用程序脱机。

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

在PostgreSQL 8.3和8.4中,CLUSTER命令得到了显着改进,因此不建议使用 VACUUM FULL - 它很慢并且会使索引膨胀。 CLUSTER将从头开始重新创建索引而不会膨胀。根据我的经验,它通常也要快得多。 CLUSTER还会使用索引对整个物理表进行排序,因此您必须选择一个索引。如果您不知道哪个,主键可以正常工作。

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

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

答案 1 :(得分:11)

您肯定希望运行VACUUM,以释放该空间以供将来插入。如果您想要实际回收磁盘上的空间,使其可供操作系统使用,则需要运行VACUUM FULL。请记住,VACUUM可以同时运行,但VACUUM FULL需要对表进行独占锁定。

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

你也想要分析,你可以把它与VACUUM结合起来。

有关详细信息,请参阅documentation

答案 2 :(得分:3)

您好 创建具有10%所需记录的临时表不是更优化。然后删除原始表并将临时重命名为原始...

答案 3 :(得分:1)

我对Postgres的世界相对较新,但我了解VACUUM ANALYZE是推荐的。我认为还有一个子选项可以释放空间。我发现reindex在批量插入或删除时也很有用。是的我一直在使用具有相似行数的表,并且速度增加非常明显(UBuntu,Core 2 Quad)