データベースは通常、テーブルにインデックスを定義しますが、データを頻繁に更新すると、インデックスがディスク装置の空き領域を効率的に利用できなくなってきます。また、これに伴い、データベースへのアクセス性能が少しずつ低下する可能性があります。
ディスク装置の使用領域を整理し、データベースへのアクセス性能の低下を防ぐために、REINDEXコマンドを定期的に実行してインデックスを再編成することを推奨します。
ディスクの使用量は、“7.2 ディスクの使用量の監視と空き領域の確保”に説明している方法で、データ格納先のディレクトリに対して確認してください。
注意
REINDEXコマンドは、処理中のインデックスに対する排他ロックを取得し、インデックスの元となるテーブルの書き込みをロックするため、これらにアクセスする他の処理はロック待ちで停止する場合があります。
そのため業務終了後に実施するなどの考慮が必要です。
参照
REINDEXコマンドの定期的な実行によるインデックスの再編成について、詳細な内容は“PostgreSQL Documentation”の“Server Administration”の“Routine Reindexing”を参照してください。
ポイント
通常は月に1回の頻度で、データベースの保守などを行う時期を見計らって実行してください。インデックスの使用量をSQL文で調べ、日々増加の傾向が見られる場合には、ディスクの空き容量と比較してインデックス再作成の実行頻度を調整します。
SQL文および実行結果の例を以下に示します。
ただし、アプリケーションの互換性を維持することを考慮し、下記のSQL文中のシステムカタログや関数を直接参照したり使用しないようにしてください。
[SQL文]
SELECT nspname AS schema_name, relname AS index_name, round(100 * pg_relation_size(indexrelid) / pg_relation_size(indrelid)) / 100 AS index_ratio, pg_size_pretty(pg_relation_size(indexrelid)) AS index_size, pg_size_pretty(pg_relation_size(indrelid)) AS table_size FROM pg_index I LEFT JOIN pg_class C ON (C.oid = I.indexrelid) LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relkind = 'i' AND pg_relation_size(indrelid) > 0 ORDER BY pg_relation_size(indexrelid) DESC, index_ratio DESC;
[実行結果]
schema_name | index_name | index_ratio | index_size | table_size -------------+----------------------------------+-------------+------------+------------ public | pgbench_accounts_pkey | 0.16 | 2208 kB | 13 MB pg_catalog | pg_depend_depender_index | 0.6 | 224 kB | 368 kB pg_catalog | pg_depend_reference_index | 0.58 | 216 kB | 368 kB ...
参照
アプリケーションの互換性の維持に関する詳細は、“アプリケーション開発ガイド”の“アプリケーションの互換に関する注意事項”を参照してください。