24.2. 例行重新索引编制

在某些情况下,值得使用REINDEX命令或一系列单独的重建步骤定期重建索引。

完全变空的 B 树索引页将被回收以供重新使用。但是,仍然有可能无法有效利用空间:如果删除了页面上除几个索引键以外的所有索引键,则该页面将保持分配状态。因此,最终删除每个范围中的大多数(但不是全部)键的使用模式将发现空间使用不佳。对于此类使用模式,建议定期重新索引。

非 B 树索引中出现膨胀的可能性尚未得到很好的研究。使用任何非 B 树索引类型时,定期监视索引的物理大小是一个好主意。

同样,对于 B 树索引,新构造的索引的访问速度比已多次更新的索引要快一些,因为在新建索引中,逻辑上相邻的页面通常在物理上也相邻。 (此考虑不适用于非 B 树索引.)可能值得定期重新索引以提高访问速度。

REINDEX可以在所有情况下安全,轻松地使用。但是,由于该命令需要排他的表锁定,因此通常最好使用一系列创建和替换步骤来执行索引重建。可以使用这种方式重新创建使用CONCURRENTLY选项支持CREATE INDEX的索引类型。如果该操作成功并且结果索引有效,则可以使用ALTER INDEXDROP INDEX的组合将原始索引替换为新建的索引。当使用索引强制执行唯一性或其他约束时,可能需要ALTER TABLE才能将现有约束与新索引强制执行的约束交换。在使用该替代多步重建方法之前,请仔细检查它,因为使用这种方法可以重新索引哪些索引存在限制,并且必须处理错误。