我有一个Postgres数据库,我正在导入/更新每天大约4 GB的数据。 (通常大约15-20万行)我正在使用批量插入从平面文件数据转储import。 我也有一个“插入重复键,更新”风格的触发器,只需更新一个行,如果该ID已经存在。 导入数据本身没有太大的增长(就文件大小而言),主要只是logging正在更新,插入less量新logging。 另外,每次导入后,我正在运行VACUUM ANALYZE 。
今天我注意到数据库的大小膨胀到15GB左右。 做了一些Googlesearch之后,我决定尝试一下VACUUM FULL和REINDEX 。 数据库的大小显着下降(约50%)。 我读了这可能是关于max_fsm_pages设置,但它看起来像是从Postgres 8.4删除,所以我不知道这是怎么回事。 在postgres日志里没有什么我能看到的特别感兴趣的东西。
这是一个过程的logging: http : //pastie.org/private/jt7mxajyyxuzvodch9goq
所有的桌子都缩小了很多,但是我觉得有趣的是,在真空和重build索引之前,最大的桌子是一个3.7GB的索引(甚至比最大的内容表2.8GB还要大),缩小到629MB。
这是正常的还是这里有什么问题? 我试图保持磁盘上的文件大小,因为这是在一个相当小的Linode虚拟机上运行的。
更新:使用pgAdmin,这里是统计信息选项卡的几个屏幕截图:
所以,从上一个截图看来,它看起来像是引起问题的索引膨胀。 表大小是3.0GB,而索引大小是4.4GB。 例如,app_prices表是行数最多的表(约3500万),只有5列和3个索引。 这是否仍然正常?
由于Postgresql实现MVCC的方式,这可能是正常的。
编辑: http : //www.postgresql.org/docs/9.0/static/routine-vacuuming.html有一个很好的解释发生了什么事以及如何处理它。