PostgreSQLの「心臓部」を覗く:pg_classを使いこなすと、DB運用が劇的に変わる話
やあ。PostgreSQLを触り始めてしばらく経つと、「今のデータベースで、実際にどのくらいのテーブルやインデックスが作られているんだろう?」とか「この巨大なテーブル、一体どのくらいのページ数を使っているんだ?」なんて疑問が湧いてくることはないかな。
そんな時、`pg_class`という存在を知っているかどうかで、エンジニアとしての「現場の引き出し」の数が全く違ってくるんだ。今日は、PostgreSQLのシステムカタログの中でも、特に重要で、かつ「これさえ知っておけば何でも調べられる」と言っても過言ではない`pg_class`について語らせてほしい。
pg_classって、結局何者?
一言で言うと、PostgreSQLにおける「リレーション(関連するもの)のマスター名簿」だ。
データベースの中には、テーブル、インデックス、シーケンス、ビュー、それに一時的なテーブルなんかがあるよね。PostgreSQLは、それらすべてを「リレーション」として抽象化して管理している。その「名前」「所有者」「ページ数」「タプル数」といったメタデータを一手に引き受けているのが、この`pg_class`なんだ。
例えば、`psql`で`\dt`や`\di`を打ったとき、PostgreSQLは裏側で`pg_class`をせっせとスキャンして、結果を表示してくれているわけだね。
実践!pg_classで「今の状態」を可視化する
マニュアルを読めばカラムの定義は載っているけれど、現場で本当に役立つクエリは意外と少ない。ここでは、僕がトラブルシューティングや調査でよく使うSQLをいくつか紹介するよ。
1. テーブルのサイズとレコード数をサクッと確認する
PostgreSQLの統計情報は、`ANALYZE`コマンドで更新されるから完全なリアルタイムではないけれど、概算を知るにはこれで十分だ。
SELECT
relname AS table_name,
reltuples AS estimate_rows,
relpages 8 / 1024 AS size_mb
FROM pg_class
WHERE relkind = ‘r’ — ‘r’は通常のテーブルを指す
ORDER BY relpages DESC
LIMIT 10;
このクエリを叩けば、「どのテーブルが肥大化しているか」「どのテーブルがレコード数に対して不自然にサイズが大きいか(=断片化が進んでいるか)」が一目瞭然だ。
2. インデックスの肥大化をチェックする
「インデックスが効いていない気がする」と感じた時、まず疑うのはインデックスの物理的な肥大化だ。`pg_class`の`relpages`を見れば、インデックスがどれだけ空っぽのブロックを抱え込んでいるかが推測できる。
SELECT
relname AS index_name,
relpages
FROM pg_class
WHERE relkind = ‘i’ — ‘i’はインデックスを指す
ORDER BY relpages DESC;
ここが異常に大きいなら、`REINDEX`を検討するタイミングかもしれないね。
覚えておくと差がつく「relkind」の小話
`pg_class`をいじる上で、`relkind`(リレーションの種類)というカラムは絶対に覚えておいてほしい。これを知っているだけで、システムカタログの検索スピードが一段階上がるからね。
- `r`: 通常のテーブル (Table)
- `i`: インデックス (Index)
- `S`: シーケンス (Sequence)
- `v`: ビュー (View)
- `m`: マテリアライズド・ビュー (Materialized View)
たまに「テーブルだと思ってたのに、実はマテリアライズド・ビューだった」なんていう勘違いで調査が迷走することがあるんだけど、そんな時は迷わず`pg_class`の`relkind`を確認するのが、現場のプロの流儀だよ。
最後に:カタログを直接いじる時の注意点
ここまで持ち上げておいて何だけど、一つだけ釘を刺させてくれ。
「pg_classを直接UPDATEやDELETEしてはいけない」。
当たり前だけど、これはデータベースの根幹を司るカタログだ。ここを壊すと、そのデータベースは二度と起動しなくなるかもしれない。あくまで`SELECT`による「参照」に留めるのが、エンジニアとしての最低限のたしなみだ。
もし「今の構成を把握したい」「パフォーマンス改善のヒントが欲しい」と思った時は、まずは`pg_class`を眺めてみてほしい。そこには、君のデータベースが今、どんな状態で、どんな悲鳴を上げているのか(あるいは余裕で動いているのか)、その真実が全部書かれているからね。
また何か気になったことがあれば、いつでも聞きに来てくれ。DBの世界は奥が深くて、本当に面白いだろ?
コメント