PostgreSQL:性能下降由于索引bloatper

我正在CentOS 4.4系统上运行PgSQL 8.1(不幸的是不能升级)。
有一个Java应用程序运行在PgSQL守护进程之上,我们需要每2个月左右对数据库进行重新索引。 同样重要的是:数据库没有增长。

看起来膨胀现在比以前快了,这往往会增加。
我的configuration在这里可用,autovacuum守护进程已启用,并经常运行:pastebin.com/RytNj7dK

你也可以find这个查询的输出wiki.postgresql.org/wiki/Show_database_bloat

运行reindex后3小时: http ://pastebin.com/raw.php?i= 75fybKyd
运行reindex后72小时: http ://pastebin.com/raw.php?i= 89VKd7PC

有没有人有任何想法,我应该调整,以摆脱日益膨胀?

谢谢你的帮助

PS:由于反垃圾邮件预防系统,我不得不删除前两个链接的前两个http://前缀。

不幸的是,如果你有一个活动的数据库(有很多插入/更新/删除),你遇到索引膨胀 – 这只是数据库生活的一个事实。 你可以做的最好的是希望减缓膨胀到你的reindex间隔是合理的点。

在这方面,我可以给你的最好的build议是升级到更新版本的Postgres(8.3或更高版本):这是当Postgres引入堆只元组的支持。
现在在你的(8.1)系统上,就索引而言, 任何对行的更新都等价于删除/插入,因此索引膨胀。 8.3和更高版本不要触摸索引,除非它们必须(“如果该行仍然适合它所在的页面”)。

升级到具有HOT支持的Postgres版本后,如果您的UPDATE触及索引列,或者如果您的UPDATE大大增加了行的大小以至于必须将其移动到新页面,但是如果你的索引策略是合理的,并且你的行在大小上是相对静态的,那么这些情况应该是比较less见的,所以索引膨胀问题应该不是什么问题。


处理指数膨胀的一些额外的一般策略:

  1. 主键索引
    你在这里几乎不走运 – 你需要REINDEX并拿走表锁。
  2. 其他指标
    • 选项1: DROP并重新CREATE非关键指标
      这具有不locking表格的优点,但是具有在重build期间取走索引的缺点。
    • 选项2:关键索引的索引混洗
      首先创build一个新的索引,而不是上面的“删除/创build”过程,然后删除旧索引并重新命名索引。
      这具有不locking表的优点,以及保留原始索引工作(虽然臃肿)的优点。 主要的缺点是你必须重新命名一个索引来保持命名约定的健全 – 一个额外的手动步骤。