我有一个Postgres数据库,每天导入/更新大约4GB的数据。(通常约有1500万至2000万行。)我正在使用大容量插入从平面文件转储导入数据。我也有一个“插入重复的键,更新”风格的触发器,它将简单地更新一个行,如果id已经存在。导入数据本身增长不大(就文件大小而言),主要是通过插入少量新记录来更新记录。而且,每次导入之后,我都要运行VACUUM ANALYZE。
今天,我注意到数据库的大小膨胀到了大约15 to。在做了一些谷歌搜索之后,我决定尝试一个VACUUM FULL和一个REINDEX。数据库的大小大幅度下降(约50%)。我读到这可能与max_fsm_pages设置有关,但它似乎是从Postgres8.4中删除的,所以我不知道这里发生了什么。在postgres的日志中没有我能看到的特别感兴趣的东西。
下面是这个过程的记录:http://pastie.org/private/jt7mxajyyxuzvodch9goq
所有的表都在大幅缩小,但我认为有趣的是,在真空和重新索引之前,最大的表是一个3.7GB的索引(甚至大于2.8GB的最大内容表),然后缩小到629 MB。
这是正常还是这里出了什么问题?我试图降低磁盘上文件的大小,因为这是在一个相当小的Linode VM上运行的。
UPDATE:使用pgAdmin,以下是统计信息选项卡的几个截图:
所以,从上一张截图来看,造成问题的绝对是索引膨胀。表大小为3.0GB,而索引大小为4.4GB。例如,app_prices表是行数最多的表(约3 500万行),只有5列和3个索引。这看起来还正常吗?
发布于 2011-06-09 03:45:08
由于Postgresql实现MVCC的方式,这可能是正常的。
编辑:http://www.postgresql.org/docs/9.0/static/routine-vacuuming.html很好地解释了正在发生的事情以及如何处理它。
https://serverfault.com/questions/278542
复制相似问题