在VACUUM FULL之后,为什么PostgreSQL性能不能恢复到最大值?

时间:2010-06-29 12:00:26

标签: postgresql performance

我有一个包含几百万元组的表。

我在大部分内容中都会进行更新。

第一次更新大约需要一分钟。第二个,需要两分钟。第三次更新需要四分钟。

之后,我执行VACUUM FULL。

然后,我再次执行更新,这需要两分钟。

如果我转储数据库并重新创建它,第一次更新将花费一分钟。

为什么在VACUUM FULL之后PostgreSQL性能不会恢复到最大值?

2 个答案:

答案 0 :(得分:3)

VACUUM FULL不压缩索引。实际上,在执行VACUUM FULL之后,索引可能会变得更糟。在VACUUM FULL之后,您应该REINDEX表。

然而,VACUUM FULL + REINDEX非常慢。您可以使用CLUSTER命令实现压缩表和索引的相同效果,该命令只需要一小部分时间。它还有一个额外的好处,它将根据您选择CLUSTER的索引对表进行排序。这可以提高查询性能。 CLUSTER相对于VACUUM FULL + REINDEX的缺点是它在运行时需要大约两倍的磁盘空间。此外,如果您运行的是早于8.3的版本,请务必小心此命令。它不是MVCC安全的,你可能会丢失数据。

另外,你可以做一个无操作的ALTER TABLE ... ALTER COLUMN语句来摆脱表和索引膨胀,这是最快的解决方案。

最后,任何VACUUM FULL问题还应该解决为什么你需要这样做的事实?这几乎总是由不正确的吸尘引起的。你应该运行autovacuum并正确调整它,这样你就不必运行VACUUM FULL。

答案 1 :(得分:2)

元组的顺序可能不同,这会导致不同的查询计划。如果您想要固定订单,请使用CLUSTER。降低FILLFACTOR并打开auto_vacuum。你也分析了吗?

使用EXPLAIN查看查询的执行方式。