【入門編】 pg_stat_user_indexes – PostgreSQL

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

日々PostgreSQLと向き合っていると、「あれ、なんか最近データベースの反応が鈍い気がするな…」なんて悩むこと、ありますよね。そんなとき、多くの人が真っ先に疑うのが「インデックス」です。

「インデックスをたくさん作れば、検索は爆速になるはず!」

そう思ってインデックスを増やし続けた結果、逆にデータベースが重くなってしまう……。これ、実は現場でよくある「インデックスの罠」なんです。

今日は、そんなインデックスの断捨離に役立つ、魔法のツール『pg_stat_user_indexes』についてお話ししますね。

—

インデックスは「本の手がかり」だけど…

そもそもインデックスって、本で言うところの「索引」みたいなものですよね。巻末に「あ」から始まる言葉がどこにあるか書いてあれば、ページをめくる時間が短縮されます。

でも、想像してみてください。もし、その本に「章ごとの索引」「単語ごとの索引」「登場人物の索引」「日付の索引」……と、何十種類もの索引が付いていたらどうでしょう?

本を開くたびに、「どの索引を最初に見ようかな?」と迷ってしまいますよね。しかも、新しいページを追加するたびに、全ての索引を更新しなきゃいけません。これだと、本を読むスピードよりも、索引を書き換える時間の方が長くなって、結局本を読み終わるのが遅くなってしまいます。

データベースもこれと全く同じなんです。「使われていないインデックス」は、検索の邪魔をするだけの「お荷物」になってしまうんですよ。

—

`pg_stat_user_indexes` で「健康診断」をしよう

そこで登場するのが、PostgreSQLが標準で用意してくれている `pg_stat_user_indexes` というビューです。これは、いわば「インデックスの利用状況カルテ」のようなもの。

これを使えば、「どのインデックスが実際に活躍していて、どれが全く役に立っていないのか」が一目でわかります。

使い方はとっても簡単。PostgreSQLのコンソールで、こんな風に叩いてみてください。

SELECT relname, indexrelname, idx_scan
FROM pg_stat_user_indexes;

これだけで、テーブル名とインデックス名、そして「そのインデックスが何回使われたか(idx_scan)」のリストが出てきます。

ここをチェックして!

このリストを見たときに、`idx_scan` の数字が「0」や、極端に小さいインデックスはありませんか?

  • 0回の場合:そのインデックスは、誰にも見向きもされていません。思い切って削除を検討しましょう!
  • 数が少ない場合:そのインデックスは、たまにしか使われません。それが「本当に必要な検索」であれば残すべきですが、もし不要なものなら消したほうがデータベースは喜びます。

—

焦って消すのはNG!「まずは観察」から

ここで一つだけ注意点を。さっきの数字が「0」だったからといって、今すぐ削除ボタンを押すのはちょっと待ってください!

データベースの世界には、「月に一度の集計処理」や「年に一度の棚卸し処理」など、たまにしか走らないけれど、その時は絶対にインデックスがないと終わらない……という処理が存在します。

なので、まずはこんな風に考えてみてください。

1. まずは「数週間」様子を見る:稼働中のシステムなら、最低でも1ヶ月くらいはデータを集めてみましょう。
2. 「本当に消していいか」を考える:開発メンバーや、そのテーブルを使うアプリケーションの担当者に「これ消しても大丈夫?」と一言聞いてみるのが一番確実です。
3. バックアップをとって削除:いざ消すときは、インデックスを作るためのSQL文をメモしておいて、いつでも元に戻せるようにしてから実行しましょう。

—

まとめ:身軽なデータベースは速い!

データベースのチューニングって、何かを「足す」ことばかり考えがちですが、実は「不要なものを削る」作業の方が、劇的にパフォーマンスを改善してくれることが多いんです。

`pg_stat_user_indexes` を使って、定期的にデータベースの健康診断をする習慣をつけると、システムは驚くほど軽快に動いてくれるようになりますよ。

「このインデックス、本当に必要かな?」

そうやってデータベースに優しく接してあげると、きっとあなたのシステムも、サクサクとした快適なレスポンスで応えてくれるはずです。ぜひ、今日のお仕事の合間にでも試してみてくださいね!

それでは、また次回の記事でお会いしましょう!

コメント

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