有時候咱們值得用 REINDEX 命令週期的重建索引。php
在 PostgreSQL 版本 7.4 以前,咱們常常有必要避免"索引膨脹", 由於缺少在 B-tree 索引內部的空間恢復機制。一個狀況是就是索引健字的範圍隨着時間而變化 — 好比,一個在某個表的時間戳上的索引,隨着時間的推移,舊的記錄會最終被刪除 — 就會致使膨脹,由於那些用於再也不使用的鍵字範圍的索引頁面不回獲得重複使用。 隨着時間的推移,索引的尺寸可能會變得比裏面的有用的數據大得多。html
從 PostgreSQL 7.4 開始,那些已經徹底清空的索引頁會獲得重複使用。 不過這樣仍然會有不充分使用空間的可能:若是一個頁面中大多數索引鍵字被刪除,只留下不多的部分呢, 那麼該頁仍然將被分配。因此,若是使用模式是這樣的:每一個範圍裏除了少數鍵字以外,其餘大部分鍵字最終都被刪除; 那麼這樣也會致使空間的低效使用。膨脹的可能性不是無窮的 — 最差的狀況是每一個頁面至少還有一個鍵字 — 可是對這樣的使用模式,咱們可能仍然值得安排週期性的從新索引。sql
對於非 B-tree 索引的膨脹可能尚未很好地定量分析。 在使用非 B-tree 索引的時候保持對索引的物理尺寸的監控是個很好的主意。spa
還有,對於 B-tree 索引,一個新創建的索引從某種意義上比更新了屢次的訪問起來要快, 由於在新創建的索引上,邏輯上鍊接的頁面一般物理上也鏈接在一塊兒。 (這樣的考慮目前並不適用於非 B-tree 索引。)僅僅從提升訪問速度角度出發, 可能咱們也值得週期性的重建索引。orm