我有一个包含几百万元组的表。
我在大部分内容中都会进行更新。
第一次更新大约需要一分钟。第二个,需要两分钟。第三次更新需要四分钟。
之后,我执行VACUUM FULL。
然后,我再次执行更新,这需要两分钟。
如果我转储数据库并重新创建它,第一次更新将花费一分钟。
为什么在VACUUM FULL之后PostgreSQL性能不会恢复到最大值?
答案 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查看查询的执行方式。