postgresql - 为什么 PostgreSQL 性能在 VACUUM FULL 之后没有恢复到最大值?

标签 postgresql performance

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

我对其中的大部分进行更新。

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

之后,我执行 VACUUM FULL。

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

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

为什么 PostgreSQL 性能在 VACUUM FULL 后没有恢复到最大值?

最佳答案

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

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

此外,您可以执行空操作 ALTER TABLE ... ALTER COLUMN 语句来摆脱表和索引膨胀,这是最快的解决方案。

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

关于postgresql - 为什么 PostgreSQL 性能在 VACUUM FULL 之后没有恢复到最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3140398/

相关文章:

python - 按列分组以在 Postgresql 中获取数组结果

python - Django 1.9 JSONField 更新行为

mysql - 如果忘记分号则更新 Postgres psql 提示

javascript - Node.JS 回调关闭 websocket

python - 在 for 循环中加速性能重写数组

postgresql - 创建表时执行触发器

database - 优化: use local files or databases for HTML

performance - 从python中的列表中获取哈希的最快方法

java - 如何提高 Solr 性能?

android - 返回需要很长时间