無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

REINDEX

名前

REINDEX -- インデックスを再構築する

概要

REINDEX { INDEX | TABLE | DATABASE | SYSTEM } 

name

 [ FORCE ]

説明

REINDEX は、インデックスのテーブルに保存されたデータを使用してインデックスを再構築し、古いインデックスのコピーと置き換えます。 以下に REINDEX が使用される状況を示します。

パラメータ

INDEX

指定したインデックスを再作成します。

TABLE

指定したテーブルの全インデックスを再作成します。 テーブルに2次的な "TOAST" テーブルがあっても、同様にインデックスを再作成します。

DATABASE

現在のデータベースのすべてのインデックスを再作成します。 共有システムカタログのインデックスも処理されます。 この構文の REINDEX をトランザクションブロック内で実行することはできません。

SYSTEM

現在のデータベースのシステムカタログに対するすべてのインデックスを再作成します。 共有システムカタログのインデックスも含みます。 ユーザテーブルのインデックスは処理されません。 この構文の REINDEX をトランザクションブロック内で実行することはできません。

name

インデックスを再作成するインデックス、テーブル、データベースの名前です。 インデックスとテーブルはスキーマで修飾可能です。 現状では、 REINDEX DATABASE REINDEX SYSTEM は現在のデータベースのインデックスのみを再作成することができます。 そのため、このパラメータは現在のデータベース名と一致する必要があります。

FORCE

このオプションは廃止されました。 指定されても無視されます。

注釈

ユーザテーブル上の特定のインデックスに破損の疑いがある場合、 REINDEX INDEX を使ってそのインデックスを再構築することもできますし、 REINDEX TABLE を使ってそのテーブルのすべてのインデックスを再構築することもできます。

システムテーブルのインデックスの破損を復旧する場合の手順はより複雑になります。 この場合、システムによって破損の可能性があるインデックス自体が使用されないようにすることが重要です (実際は、このようなケースでは、破損したインデックスに依存していたため、サーバプロセスが起動時に強制終了してしまう可能性があります)。 安全に復旧させるには、システムカタログ検索時のインデックスの使用を禁止する -P オプションを使用してサーバを起動しなければなりません。

考えられる方法の1つは次の方法です。まず、サーバを停止して、コマンドラインから -P オプションを指定してシングルユーザ状態の PostgreSQL サーバを起動します。 そして、再構成する範囲に応じて、 REINDEX DATABASE REINDEX SYSTEM REINDEX TABLE 、または、 REINDEX INDEX コマンドを発行します。 範囲が不明な場合は、 REINDEX SYSTEM を使用して、そのデータベースの全てのシステムインデックスを再構成してください。 その後、シングルユーザ状態のサーバセッションを停止して、実サーバを再起動します。 シングルユーザ状態のサーバインタフェースの操作方法についての詳細は、 postgres マニュアルページを参照してください。

その他、コマンドラインで -P を指定して実サーバセッションを起動することもできます。 具体的な方法は、クライアントによって異なります。 しかし、 libpq ベースのクライアントであれば、クライアントを起動する前に PGOPTIONS 環境変数を -P に設定すれば実現できます。 この方法では他のクライアントを締め出す必要はありませんが、修復が終わるまで破損したデータベースへの他のユーザの接続を防止する方が良いことに注意してください。

REINDEX は、インデックスの中身を1から作り直すという点では、インデックスを削除してから再作成する処理と似ています。 しかし、ロックに関しては異なります。 REINDEX はインデックスの元となるテーブルの書き込みをロックしますが、読み込みはロックしません。 また、処理中のインデックスに対する排他ロックを取得するので、そのインデックスを使用する読み込みはブロックされます。 一方、 DROP INDEX は瞬間的に元となるテーブルの排他ロックを取得するので、書き込みも読み込みもブロックされます。 その後に行う CREATE INDEX では書き込みのみをロックし、読み込みはロックしません。 インデックスは存在しないので、インデックスを使用する読み込みは発生しません。 したがって、読み込みがブロックされることはありませんが、コストが高いシーケンシャルスキャンの使用を強制されることになります。

単一インデックスまたは単一テーブルのインデックス再作成を行うには、そのインデックスまたはテーブルの所有者でなければなりません。 データベースに対するインデックス再作成を行うには、データベースの所有者でなければなりません(したがって、この所有者は他のユーザが所有するテーブルのインデックスを再作成することができます)。 もちろん、スーパーユーザは常にすべてのインデックス再作成を行うことができます。

PostgreSQL 8.1より前まででは、 REINDEX DATABASE は名前から想像されるすべてのインデックスに対する処理ではなく、システムインデックスのみを処理していました。 REINDEX SYSTEM で、この以前の処理を行わせることができます。

PostgreSQL 7.4より前までは、 REINDEX TABLE はTOASTテーブルに対して自動的に処理を行いませんでした。 そのため、別のコマンドでインデックスを再作成しなければなりませんでした。 現在でもこれは可能ですが、冗長です。

単一のインデックスを再構築します。

REINDEX INDEX my_index;

my_table テーブル上のすべてのインデックスを再構築します。

REINDEX TABLE my_table;

システムインデックスが有効かどうかを確認することなく、あるデータベース内の全てのインデックスを再構築します。

$ 
export PGOPTIONS="-P"

$ 
psql broken_db

...
broken_db=> REINDEX DATABASE broken_db;
broken_db=> \q

互換性

標準SQLには REINDEX はありません。


powered by SEO.CUG.NET