我有一个拥有九百万行的表。我发现其中大量(约90%)可以被释放。清理后需要哪些操作?是Vacuum、重新索引等。
我有一个拥有九百万行的表。我发现其中大量(约90%)可以被释放。清理后需要哪些操作?是Vacuum、重新索引等。
如果你想在文件系统上释放空间,可以使用VACUUM FULL
或CLUSTER
。在运行这些操作之后,您可能还想运行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分钟。
你肯定想运行VACUUM,以释放未来插入所需的空间。如果你想要真正回收磁盘上的空间,使其可用于操作系统,则需要运行VACUUM FULL。请注意,VACUUM可以并发运行,但是VACUUM FULL需要锁定表的排他锁。
在VACUUM运行后,索引仍将保持膨胀状态,因此您还需要REINDEX。如果可能,更快的方法是删除索引并从头开始创建它。
您还需要进行ANALYZE,这可以与VACUUM一起进行。
有关更多信息,请参见文档。
你觉得使用一个有10%所需记录的临时表是否更加优化?然后删除原始表并将临时表重命名为原始表...
我对Postgres的世界相对较新,但我了解到VACUUM ANALYZE是推荐的。我认为还有一个子选项只是释放空间。当进行批量插入或删除时,我也发现重新索引很有用。是的,我一直在使用具有类似行数的表格,速度的提升非常明显(UBuntu,Core 2 Quad)。