每日批量更新后,Postgresql 9 数据库大小膨胀

每日批量更新后,Postgresql 9 数据库大小膨胀

我有一个 Postgres 数据库,每天要导入/更新大约 4 GB 的数据。(通常大约 1500-2000 万行。)我使用批量插入从平面文件转储数据中导入数据。我还有一个“插入重复键,更新”样式的触发器,如果​​ ID 已经存在,它将简单地更新一行。导入数据本身不会增长太多(就文件大小而言),主要是记录正在更新,插入少量新记录。此外,每次导入后我都会运行VACUUM ANALYZE

今天我注意到数据库大小膨胀到大约 15GB。在谷歌搜索后,我决定尝试 aVACUUM FULL和 a REINDEX。数据库大小显著下降(约 50%)。我读到这可能与设置有关,max_fsm_pages但看起来从 Postgres 8.4 开始就删除了该设置,所以我不确定这里发生了什么。在 postgres 日志中我没有看到任何特别有趣的内容。

以下是该过程的记录:http://pastie.org/private/jt7mxajyyxuzvodch9goq

所有表都大幅缩小,但我认为有趣的是,在清理和重新索引之前,最大的表是一个 3.7GB 的索引(比最大的内容表 2.8GB 还要大),而缩小到 629 MB。

这是正常的还是出了什么问题?由于这是在相当小的 Linode VM 上运行的,因此我试图减小磁盘文件大小。


更新:使用 pgAdmin,以下是统计信息选项卡的一些屏幕截图:

因此,从最后一张截图来看,问题肯定是索引膨胀造成的。表大小为 3.0GB,而索引大小为 4.4GB。例如,app_prices 表是行数最多的表(约 3500 万),只有 5 列和 3 个索引。这看起来还正常吗?

答案1

由于 Postgresql 实现 MVCC 的方式,这可能是正常的。

编辑: http://www.postgresql.org/docs/9.0/static/routine-vacuuming.html对于正在发生的事情以及如何处理有很好的解释。

相关内容