WEB開発備忘録

データベースのインデックス再作成 / PostgreSQLのreindexdb

PostgreSQLではreindexdbコマンドでデータベース内のインデックスを再作成することが出来ます。
reindexdbはSQL「reindex」のラッパです。再作成処理の内容は全く同じです。

reindexdbコマンドの実行例(DB内すべて)

[prompt] # su - postgres
[prompt] $ reindexdb

reindexはインデックが膨張状態、つまり空ページが多くなった状態を再構築して回復します。

reindexはindexの元となるテーブルの書き込みをブロックします。
またそのインデックスを使用する読込もブロックされます。(処理中のインデックスに対する排他ロックを取得)

運用に影響を与えずにインデックスを作成するためには、インデックスを削除してからCREATE INDEX CONCURRENTLYコマンドを再発行しなければなりません。
稼働中のサービスのreindexを行う際には、サービスを停止する必要があります。

サービス停止が出来ない場合は「CREATE INDEX CONCURRENTLYコマンド」で別名インデックスを発行し、古いインデックスをdropした後に新しいインデックスを前のインデックスに変える方法があります。。この方法だとreindex時のロックを回避出来ます。ただしprimary key indexにはCONCURRENTLYは利用出来ません。

reindexdbコマンドのオプション
-a|–all
全てのデータベースに
-d|–dbname データベース名
指定したデータベースに
-i|–index インデックス名
指定したインデックスのみ
-q|–quiet
進行メッセージ表示無し
–s|–system
データベースのシステムカタログのインデックスを再作成
-t|–table テーブル名
指定テーブルのみ