【SQL実践|実務向け】PostgreSQLで作成済みのインデックスを効率的に確認・管理する方法

導入: なぜインデックスの確認が重要なのか

データベースのパフォーマンスチューニングにおいて、インデックスの管理は避けて通れません。しかし、運用が長くなると「どのテーブルに何のインデックスが作成されているか」「重複したインデックスが存在していないか」といった状況を把握しきれなくなることがあります。不要なインデックスは書き込み性能を低下させるため、現在の状態を素早く確認するスキルは、DBAにとって必須のルーチンワークです。

基礎知識: PostgreSQLのインデックス確認方法

PostgreSQLのコマンドラインツールである「psql」には、データベースの状態を確認するための便利なメタコマンドが用意されています。インデックスを確認する主なコマンドは「\di」と「\d」です。
\diは、データベース内に存在するインデックスの一覧をリストアップする際に使用します。
\dは、特定のテーブルやインデックスの詳細情報を確認する際に使用します。これらを使い分けることで、全体像の把握から詳細な定義の調査までスムーズに行えます。

実装/解決策: コマンド操作の実際

まずは現在接続しているデータベース内のインデックスを一覧表示してみましょう。

1. 全般的な確認
psqlでデータベースに接続後、以下のコマンドを入力します。
\di

2. 特定スキーマの確認
特定のスキーマ(例: sales_schema)にあるインデックスだけを確認したい場合は、ワイルドカードを使用します。
\di sales_schema.

3. インデックスの詳細確認
特定のインデックス(例: idx_user_id)がどのテーブルのどのカラムに紐付いているかを知りたい場合は、以下のコマンドを使用します。
\d idx_user_id

サンプルプログラム: システムカタログを用いた高度な抽出

psqlコマンドだけでなく、SQLクエリを直接発行して抽出を行うと、後続の処理(CSV出力や特定の条件でのフィルタリング)に役立ちます。以下は、システムカタログ「pg_indexes」から情報を取得する実用的なSQLです。

— インデックス名、テーブル名、定義内容を表示するクエリ
SELECT
schemaname,
tablename,
indexname,
indexdef
FROM
pg_indexes
WHERE
schemaname NOT IN (‘pg_catalog’, ‘information_schema’) — システム関連を除外
ORDER BY
tablename,
indexname;
— このクエリを実行することで、テーブルごとのインデックス構造を一覧で把握できます。

応用・注意点: 現場での運用アドバイス

現場でインデックスを管理する際、以下の点に注意してください。

1. 不要なインデックスの特定
今回紹介した方法でインデックスを確認し、「pg_stat_user_indexes」ビューと照らし合わせることで、長期間使用されていないインデックスを見つけることができます。不要なものは積極的に削除を検討しましょう。

2. スキーマ修飾の習慣化
運用環境では複数のスキーマが混在することが多いため、コマンドを実行する際は必ず「スキーマ名.インデックス名」のように明示的に指定する癖をつけておくことを推奨します。これにより、誤った操作を防ぐことができます。

3. 命名規則の遵守
インデックス名がデフォルトのままだと、どのテーブルに対するものか判別が困難になります。運用開始時に「idx_テーブル名_カラム名」といった命名規則を策定し、一覧を見ただけで意図が伝わるようにしておくことが、後のメンテナンス効率を大きく左右します。

コメント

タイトルとURLをコピーしました