web-dev-qa-db-ja.com

postgres;インデックスは自動的に新しいデータのインデックスを再作成しますか?

Postgresテーブルに一連の行がある場合、インデックスを作成します。作成後に新しいデータ行が挿入された場合、インデックスは自動的に更新されますか?

別の言い方をすれば、REINDEXはいくつかのまれなシナリオでのみ必要ですか、それとも新しいデータが追加されたときだけですか?

7
Tommy

新しいデータには自動的にインデックスが作成されます。ただし、インデックスがあるとinsertsとupdatesが遅くなります(もちろんdeletesも同様です)。トランザクションの量が非常に多いテーブルの場合は、インデックスの追加に十分注意する必要があります。 mostシステムのmostテーブルの場合、これは問題ではありません。

reindexは、通常の状況ではほとんど必要ありません。これらのまれなケースのうち、最も一般的なものはおそらく多くの変異によって引き起こされる「膨張」です。通常、これらの変異によりディスク上のデータが「中間」から削除され、「終了」に追加されます。

4
Colin 't Hart

documentation を引用させてください:

REINDEXは、インデックスのテーブルに格納されているデータを使用してインデックスを再構築し、インデックスの古いコピーを置き換えます。 REINDEXを使用するシナリオはいくつかあります。

  • インデックスが破損し、有効なデータが含まれていません。理論的にはこれが発生することはありませんが、実際には、ソフトウェアのバグやハードウェアの障害によりインデックスが破損する可能性があります。 REINDEXは回復方法を提供します。

  • インデックスが「肥大化」しました。つまり、インデックスには空のページまたは空に近いページが多数含まれています。これは、特定の一般的でないアクセスパターンの下で、PostgreSQLのBツリーインデックスで発生する可能性があります。 REINDEXは、デッドページのない新しいバージョンのインデックスを書き込むことにより、インデックスのスペース消費を削減する方法を提供します。詳細は項24.2を参照してください。

  • インデックスの格納パラメーター(fillfactorなど)を変更し、変更が完全に有効になるようにしたい。

  • CONCURRENTLYオプションを使用したインデックス作成が失敗し、「無効な」インデックスが残っています。このようなインデックスは役に立ちませんが、REINDEXを使用してインデックスを再構築すると便利です。 REINDEXは同時ビルドを実行しないことに注意してください。本番環境を妨げずにインデックスを構築するには、インデックスを削除して、CREATE INDEX CONCURRENTLYコマンドを再発行する必要があります。

REINDEXUPDATE呼び出しなどのルーチンプロシージャの後にINSERTを呼び出す必要があることは何も言われていません。

「作成後に新しいデータ行が挿入された場合、インデックスは自動的に更新されますか」という質問に答えます。はい、インデックスは自動的に再構築されますが、それ以外の場合はあまり意味がありません。 OLTPデータベースでのインデックスの再構築はトランザクションの一部であるため、大量のインデックスを持つテーブルでINSERT/UPDATE/DELETEに時間がかかる場合があります-インデックスが再構築されるまで操作は完了しません。

1
Ilya Konyukhov