我有一张900万行表。我发现可以释放大量的(大约90%)。清理后需要采取什么行动?真空,重新索引等。
提前致谢。
答案 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)