有时候咱们值得用 REINDEX 命令周期的重建索引。php
在 PostgreSQL 版本 7.4 以前,咱们常常有必要避免"索引膨胀", 由于缺少在 B-tree 索引内部的空间恢复机制。一个状况是就是索引健字的范围随着时间而变化 — 好比,一个在某个表的时间戳上的索引,随着时间的推移,旧的记录会最终被删除 — 就会致使膨胀,由于那些用于再也不使用的键字范围的索引页面不回获得重复使用。 随着时间的推移,索引的尺寸可能会变得比里面的有用的数据大得多。html
从 PostgreSQL 7.4 开始,那些已经彻底清空的索引页会获得重复使用。 不过这样仍然会有不充分使用空间的可能:若是一个页面中大多数索引键字被删除,只留下不多的部分呢, 那么该页仍然将被分配。因此,若是使用模式是这样的:每一个范围里除了少数键字以外,其余大部分键字最终都被删除; 那么这样也会致使空间的低效使用。膨胀的可能性不是无穷的 — 最差的状况是每一个页面至少还有一个键字 — 可是对这样的使用模式,咱们可能仍然值得安排周期性的从新索引。sql
对于非 B-tree 索引的膨胀可能尚未很好地定量分析。 在使用非 B-tree 索引的时候保持对索引的物理尺寸的监控是个很好的主意。spa
还有,对于 B-tree 索引,一个新创建的索引从某种意义上比更新了屡次的访问起来要快, 由于在新创建的索引上,逻辑上链接的页面一般物理上也链接在一块儿。 (这样的考虑目前并不适用于非 B-tree 索引。)仅仅从提升访问速度角度出发, 可能咱们也值得周期性的重建索引。orm