【入門編】 pg_stat_user_indexesの活用 – PostgreSQL

こんにちは!データベースの世界へようこそ。

今日は、PostgreSQLを使っていると必ず一度は直面する「インデックス(索引)」のお話です。

皆さんは、図書館や本屋さんに並んでいる「分厚い辞書」を想像してみてください。巻末に「索引(インデックス)」がついていますよね? あの索引があるおかげで、私たちは単語をペラペラとめくって探すことなく、一瞬で目的のページにたどり着けます。

データベースにおけるインデックスもこれと全く同じ役割。検索を爆速にしてくれる、いわば「魔法のしおり」なんです。

でもね、もしその辞書に「1ページ目から1000ページ目まで、すべての単語が網羅された索引」が挟まっていたらどうでしょう? 辞書よりも索引の方が重くなって、持ち運ぶのも大変だし、そもそも探すのにも一苦労ですよね。

データベースでも同じことが起きます。「とりあえずインデックスをたくさん作っておけば安心!」と何も考えずに作りすぎると、データの保存が遅くなったり、逆に検索が非効率になったりするんです。

今日は、そんな「お荷物になっているインデックス」を賢く見つける方法を一緒に見ていきましょう。

—

「使われていないインデックス」をあぶり出す魔法の呪文

PostgreSQLには、自分自身がどう働いているかを教えてくれる便利な機能があります。その中でも、今回主役にするのが `pg_stat_user_indexes` という統計情報です。

これは「どのインデックスが、何回使われたか」をすべて記録している、いわば「勤怠管理表」のようなもの。これを確認すれば、「君、最近全然仕事してないよね?」というインデックスがすぐにバレてしまうわけです。

試しに、以下のSQLを叩いてみてください。

SELECT
relname AS テーブル名,
indexrelname AS インデックス名,
idx_scan AS スキャン回数
FROM
pg_stat_user_indexes
ORDER BY
idx_scan ASC;

—

結果を見てみよう!

このクエリを実行すると、インデックスごとに「今まで何回使われたか(idx_scan)」が表示されます。

ここで注目してほしいのは、「idx_scan」が「0」や、極端に小さい数字になっているインデックスです。

  • 0回の場合: 完全に「お荷物」です。誰も使っていないのに、新しいデータを保存するたびに、データベースはそのインデックスを更新するために無駄な労力を使っています。これはもう、断捨離の対象ですね。
  • 数回程度の場合: 「本当に必要なのか?」を疑ってみるべきです。特定のバッチ処理で年に一度しか使わないようなものなら、残す価値があるか検討が必要です。

注意!消す前にちょっと待って

「よし、じゃあ全部消しちゃおう!」…ちょっと待ってください!ここがデータベースエンジニアの腕の見せ所です。

統計情報はあくまで「今までの結果」に過ぎません。例えば、

  • 毎月の月末処理でしか使わないインデックス
  • 年に一度の決算の時だけ爆発的に活躍するインデックス

これらは、日々の統計データで見ると「ほとんど使われていない」ように見えてしまいます。うっかり消してしまうと、決算の時期に「サイトが激重になった!」なんて悲劇が起きかねません。

賢い断捨離のコツ

1. まずは様子を見る: 統計情報をリセットしたり、長期間(できれば数ヶ月)の運用データを見て判断しましょう。
2. 一時的に無効化する: すぐに消去(DROP)するのではなく、一度 `ALTER INDEX … SET (visible = false);`(バージョンによりますが)のように無効化して、システムに影響がないか数日様子を見るのも手です。
3. 本当に必要か問う: そのインデックスが何のために作られたのか、当時の設計図やチームメンバーに聞いてみることも大切ですよ。

—

最後に:データベースも「身軽さ」が大事

データベースのパフォーマンスを良くするコツは、「インデックスを増やすこと」ではなく、「本当に必要なものだけを残して、他は捨てること」にあります。

部屋の掃除と同じで、不要なものを捨てれば、必要なものにすぐに手が届くようになり、結果としてシステム全体がサクサク動くようになります。

ぜひ、皆さんのデータベースでも `pg_stat_user_indexes` を覗いてみてください。「こんなに使われていないインデックスがあったの!?」という驚きがあるかもしれません。

もし分からないことや、もっと深く知りたいことがあったら、いつでも聞いてくださいね。一緒に快適なデータベース環境を作っていきましょう!

コメント

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