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

我有一个Postgres数据库,我正在导入/更新每天大约4 GB的数据。 (通常大约15-20万行)我正在使用批量插入从平面文件数据转储import。 我也有一个“插入重复键,更新”风格的触发器,只需更新一个行,如果该ID已经存在。 导入数据本身没有太大的增长(就文件大小而言),主要只是logging正在更新,插入less量新logging。 另外,每次导入后,我正在运行VACUUM ANALYZE

今天我注意到数据库的大小膨胀到15GB左右。 做了一些Googlesearch之后,我决定尝试一下VACUUM FULLREINDEX 。 数据库的大小显着下降(约50%)。 我读了这可能是关于max_fsm_pages设置,但它看起来像是从Postgres 8.4删除,所以我不知道这是怎么回事。 在postgres日志里没有什么我能看到的特别感兴趣的东西。

这是一个过程的logging: http : //pastie.org/private/jt7mxajyyxuzvodch9goq

所有的桌子都缩小了很多,但是我觉得有趣的是,在真空和重build索引之前,最大的桌子是一个3.7GB的索引(甚至比最大的内容表2.8GB还要大),缩小到629MB。

这是正常的还是这里有什么问题? 我试图保持磁盘上的文件大小,因为这是在一个相当小的Linode虚拟机上运行的。


更新:使用pgAdmin,这里是统计信息选项卡的几个屏幕截图:

  • 数据库统计: http : //cl.ly/1v1t2L0n2m4220001F2v
  • 所有表统计: http : //cl.ly/273B3F242O2y2Z3C3c2L
  • app_prices表格统计: http ://cl.ly/1P3Y142P2d2P3v3s0p11

所以,从上一个截图看来,它看起来像是引起问题的索引膨胀。 表大小是3.0GB,而索引大小是4.4GB。 例如,app_prices表是行数最多的表(约3500万),只有5列和3个索引。 这是否仍然正常?

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

编辑: http : //www.postgresql.org/docs/9.0/static/routine-vacuuming.html有一个很好的解释发生了什么事以及如何处理它。