インデックスの肥大化
削除されたエントリが疎なページを残し、それが詰め直されないせいで、本来の3倍の容量を食っているインデックス。
原因は MVCC にある。更新すると新しい行バージョンができ、同時に新しいインデックスエントリも作られるが、古いエントリは vacuum が片付けるまで残る。空いた領域が再利用されるのは、新しい値がたまたまそのページに属する場合だけで、タイムスタンプのように単調増加するキーではほぼ起きない。結果として半分空のページだらけの B-tree になり、読むページが増え、キャッシュ効率が落ち、検索が遅くなる。
測定には pgstattuple 拡張や定番の推定クエリを使う。対処は、書き込みを止めずにインデックスを再構築できる REINDEX CONCURRENTLY(PostgreSQL 12 以降)、古いバージョンなら pg_repack である。