Postgres维护的正确顺序

Posted

技术标签:

【中文标题】Postgres维护的正确顺序【英文标题】:Correct order of Postgres maintenance 【发布时间】:2012-07-10 23:14:31 【问题描述】:

我有一张大表,因为很多行经常更新,因此索引膨胀。我也在删除大量行。

为了恢复磁盘空间,执行以下任务的正确顺序是什么?

真空,将死元组标记为空闲以供数据库重用,不返回 系统空间。 Vacuum Full,重写表减少表膨胀, 将空间返回给系统。 重新索引,重写索引减少索引 膨胀,将空间返回给系统。

【问题讨论】:

【参考方案1】:

从 PostgreSQL 9.0 开始,VACUUM FULL 应该以最佳方式返回磁盘空间(就像 CLUSTER 一样)。我引用了当前手册 here 中 9.0 的发行说明:

VACUUM FULL 的新实现。该命令现在重写 整个表和索引,而不是将单个行移动到 紧凑的空间。在大多数情况下,它的速度要快得多,而且不再 导致索引膨胀。

请注意,通常不需要甚至不建议运行VACUUM FULL。如果您从数据页面中删除所有 HOT 更新等的摆动空间,它可能会减慢更新速度。

【讨论】:

是的,我知道 VACUUM FULL 被重写了,我不知道索引也被重写了。尽管如此,我的问题仍然存在,在所描述的情况下,最好的行动和执行顺序是什么? @Gothmog:为了恢复磁盘空间,就是:VACUUM FULLCLUSTER。不需要其他任何东西。我会VACUUM FULL ANALYZE 以获取当前统计信息。不需要REINDEX。通常,如果不是为了恢复磁盘空间,并且您不只是删除表的大部分内容,则应该使用VACUUM ANALYZE

以上是关于Postgres维护的正确顺序的主要内容,如果未能解决你的问题,请参考以下文章

不同步时如何重置postgres的主键序列?

在Macbook上创建的Postgres DB的Ruby on Rails项目需要在Windows 10上访问

ORDER BY 中的最后一个案例执行不正确 postgres

HashTable 是不是维护插入顺序?

使用 Apache Airflow 更新和维护 postgres 表

Postgres 表中列的顺序会影响性能吗?