大量postgres删除后的自由空间

Mil*_*ota 22 database postgresql

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

提前致谢.

int*_*tgr 44

如果要释放文件系统上的空间,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分钟.

  • @YasiruG 不幸的是,这些操作创建了表的完整新副本,因此如果表(不包括已删除的行)大于 1GB,则会失败。您可以删除并重新创建索引以暂时释放空间。另一种选择是将此表的 pg_dump 到单独的机器或磁盘,然后删除表并恢复它——这将像 VACUUM 一样释放空间。 (2认同)

DNS*_*DNS 11

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

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

您还需要ANALYZE,您可以将其与VACUUM结合使用.

有关详细信息,请参阅文档.