【実務・中級編】 pg_index – PostgreSQL

「あ、またクエリが遅いって言われてる?」

そんな溜息混じりの朝、DBエンジニアなら一度は経験しますよね。そんな時、僕らがまず覗くのが`pg_index`というシステムカタログです。

PostgreSQLのパフォーマンスチューニングにおいて、インデックスは「魔法の杖」のように思われがちですが、実際には「地図」です。そして`pg_index`は、その地図の目録を管理している、いわば「司令塔」のような存在。

今日は、教科書には載っているけれど、現場でどう使いこなせばいいのか、少し深掘りして解説しますね。

—

pg_indexって結局なに?

一言で言えば、「インデックスの素性をすべて知っているデータベースの管理台帳」です。

テーブル(`pg_class`)とインデックス(これも`pg_class`)を紐付け、「このインデックスはどの列に使われているのか?」「ユニーク制約があるのか?」といった、データベースがクエリを処理する際に必ず参照する情報がここに詰まっています。

正直、普段使いで`SELECT FROM pg_index`を叩くことは稀です。でも、「本当にインデックスが効いているのか?」「似たようなインデックスを重複して作っていないか?」を確認するとき、これ以上の情報源はありません。

—

現場で役立つ活用法:隠れた重複インデックスを見つける

よくあるのが、開発中に「とりあえずこの列で検索するから」とインデックスを追加し続けて、いつの間にか似たようなインデックスが乱立しているパターン。これ、書き込みのたびにインデックス更新のオーバーヘッドが発生して、地味にデータベースを重くする原因になります。

そんな時、こんなクエリを叩いてみてください。

SELECT
t.relname AS table_name,
i.relname AS index_name,
idx.indkey AS column_index,
idx.indisunique AS is_unique
FROM pg_index idx
JOIN pg_class t ON t.oid = idx.indrelid
JOIN pg_class i ON i.oid = idx.indexrelid
WHERE t.relname = ‘users’; — チェックしたいテーブル名

これだけで、そのテーブルにどんなインデックスがどういう属性でぶら下がっているか一目瞭然です。

ここがポイント:`indkey`の読み方

結果を見ると、`indkey`という列が出てきますよね。これは`1 3`とか`5 2`のような数字の列です。これは「テーブルの何番目の列を使っているか」を示しています。

もし、同じテーブルで似たような`indkey`を持つインデックスがあれば、片方は不要かもしれません。不要なインデックスを消すだけで、`INSERT`の速度が劇的に改善すること、よくあるんですよ。

—

「インデックスはあるのに使われない」を調査する

現場で一番頭を抱えるのが、「インデックスを貼ったはずなのに、Seq Scan(全表走査)されている」というケース。

そんな時は、`pg_index`だけでなく、実際にそのインデックスが使われたかどうかの統計情報(`pg_stat_user_indexes`)と組み合わせるのが鉄則です。

SELECT
i.relname AS index_name,
idx_stat.idx_scan, — これまで何回使われたか
idx.indisvalid — 有効かどうか
FROM pg_index idx
JOIN pg_stat_user_indexes idx_stat ON idx.indexrelid = idx_stat.indexrelid
JOIN pg_class i ON i.oid = idx.indexrelid
WHERE idx_stat.relname = ‘users’;

`idx_scan`がずっと0のままなら、そのインデックスは「お荷物」確定です。インデックスは「ただ作ればいい」わけじゃなく、「使われてこそ価値がある」もの。定期的にこの数字をチェックする習慣をつけると、一歩上のエンジニアになれますよ。

—

最後に:先輩からのアドバイス

`pg_index`の中身をいじろうなんて思わないでくださいね(笑)。ここはあくまで「読み取り専用」のカタログだと思って、優しく見守るのがコツです。

PostgreSQLは非常に賢いデータベースですが、それでも「どのインデックスを使うのが最適か」という判断は、僕ら人間が正しい地図を与えてあげないと迷子になります。

「なんか最近重いな」と思ったら、まずは`pg_index`を覗いてみてください。そこには、データベースが抱えている「整理整頓されていない情報」のヒントが必ず落ちています。

インデックスの管理は、部屋の掃除と同じ。こまめにカタログをチェックして、身軽でキビキビ動くデータベースを育てていきましょう!

また何か詰まったら、いつでも聞きに来てくださいね。では、また。

コメント

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