REINDEX は、テーブルに保存されたデータを元にインデックスを再構築し、古いインデックスのコピーと置き換えます。 REINDEX の使用には大きく2つの目的があります。
インデックスが破損してしまい、有効なデータがなくなった場合です。 理論的には決して起こらないことですが、実際には、ソフトウェアのバグやハードウェアの障害により破損することがあります。 REINDEX はこの修復手段を提供します。
対象とするインデックスが回収されることがない使用されないインデックスページを多く含む場合です。 これは、特定のアクセスパターン下のPostgreSQLのB-treeインデックスで起こり得ます。 REINDEX は、使用されないページを持たない新しいインデックスを書き直すことでそのインデックスの領域消費量を減少させる手段を提供します。 詳細は項21.2を参照してください。
指定したデータベースの全てのシステムインデックスを再作成します。 ユーザテーブル上のインデックスは処理されません。 また、スタンドアローンモード(後述)以外では、共有システムカタログは飛ばされます。
指定したテーブルの全インデックスを再作成します。 テーブルに2次的な"TOAST"テーブルがあっても、同様にインデックスを再作成します。
指定したインデックスを再作成します。
インデックスを再作成するデータベース、テーブル、インデックスを指定する名前です。 テーブルとインデックスはスキーマで修飾可能です。
このオプションは廃止されました。指定されても無視されます。
ユーザテーブル上の1つのインデックスに破損の疑いがある場合、単にそのインデックスを再構築してください。 テーブル上の全てのインデックスの場合は、REINDEX INDEX か REINDEX TABLE を使用してください。 破損したユーザテーブルのインデックスを扱う他の方法は、単純にそれを削除し生成し直すことです。 差し当たり見かけ上通常の操作で保守作業を行いたい場合は、この方法が実際の所好まれます。 REINDEX はそのテーブルの排他的ロックを必要としますが、CREATE INDEX はテーブルへの書き込みのみをロックし、読み込み時はロックしません。
システムテーブルのインデックスの破損を復旧する必要がある場合はより複雑になります。 この場合、システムに疑わしいインデックス自体を使用しないようにさせることが重要です。 (実際は、このような場合は、破損したインデックスへの依存によりサーバプロセスはその起動時に強制終了してしまうことになるでしょう。) 安全に復旧させるには、システムカタログ検索時のインデックスの使用を抑制する-Pオプションを使用してサーバを起動させなければなりません。
この1つの方法は、postmasterを停止させ、-Pオプションをコマンドラインに入れてスタンドアロン状態のPostgreSQL サーバを起動させることです。 そして、どこまで再構成させたいのかによって、REINDEX DATABASE、REINDEX TABLE、または、REINDEX INDEX コマンドを発行します。 不明な場合は、REINDEX DATABASE を使用して、そのデータベースの全てのシステムインデックスを再構成を選んでください。 そして、スタンドアロン状態のサーバセッションを停止させ、実サーバを再起動して下さい。 スタンドアロン状態のサーバインタフェースの操作方法についてのより詳細はpostgresマニュアルページを参照してください。
その他、-P をコマンドラインオプションに含めて、実サーバセッションを起動させることができます。 これを実現させる方法は、クライアントによって異なります。 しかし、全てのlibpqベースのクライアントでは、クライアントを起動する前にPGOPTIONS環境変数を-Pに設定することで可能です。 この方法では他のクライアントを締め出す必要はありませんが、修復が終るまで破損したデータベースへの他のユーザの接続を防止する方が良いことに注意してください。
共有システムカタログ(pg_database、pg_group、pg_shadow)のいずれかのインデックスが破損した疑いがある場合、修復のためにはスタンドアロンサーバを使用しなければなりません。 マルチユーザモードでは共有カタログの処理を行いません。
共有システムカタログ以外の全てのインデックスでは、REINDEXはクラッシュセーフかつトランザクションセーフです。 共有インデックスに対するREINDEXはクラッシュセーフではありません。 これが、通常の運用状態で実行できない理由です。 スタンドアロンモードで、これらのカタログのインデックス再作成処理中に問題が発生した場合、問題が修正されるまで実サーバを再起動することができなくなります。 (共有インデックスの部分的な再構築に関するよくある兆候は、"index is not a btree" というエラーです。)
PostgreSQL 7.4より前まで、REINDEX TABLEはTOASTテーブルに対して自動的に処理を行いませんでした。そのため、別のコマンドでインデックスを再作成しなければなりませんでした。 これは可能になりましたが、冗長です。