PostgreSQL 在某些情况下不能复用 B-tree 索引页面。问题是这样的如果索引行被删除,那么那些索引页面只能被那些 有着相似数值的行所利用。比如,如果一个索引行被删除,而新插入或者更新 的行的数值高得多,那么新行就不能使用已经删除的行用过的索引空间。 这样的新行就必须放在一个新的索引页面里。这个时候,索引使用的磁盘空间 就会不确定地增长,即使经常运行 VACUUM 也会这样。
为了解决这个问题,你可以周期性使用 REINDEX 命令 抛弃已删除行使用地磁盘空间。在 contrib/reindexdb 里面还有 一个贡献包,可以对整个数据库进行重建索引的工作。