こんにちは!データベースエンジニアとして日々、クエリの遅延と戦っている私です。
今日は、PostgreSQLの「裏側の頭脳」とも言える、`pg_statistic` という少しマニアックなテーブルについてお話ししようと思います。「統計情報」なんて聞くと難しく感じるかもしれませんが、実は私たちの日常生活にもある「ある仕組み」と全く同じなんです。
肩の力を抜いて、一緒に見ていきましょうね。
—
データベースの「要約ノート」
想像してみてください。あなたは巨大な図書館の司書さんです。
何百万冊もの本が並ぶ中で、お客さんから「〇〇というジャンルの本、どこにある?」と聞かれたとき、いちいち館内を全部走り回って探しますか?
そんなことしたら、日が暮れてしまいますよね。だから、司書さんは手元に「館内の案内マップ」や「在庫リスト」を持っています。
PostgreSQLにとって、この「案内マップ」の役割を果たすのが `pg_statistic` です。
なぜ `pg_statistic` が必要なの?
SQLを実行したとき、PostgreSQLの「プランナ(計画を立てる人)」は、データをどうやって取ってくるのが一番早いかを一瞬で考えます。
- 「このテーブル、データが10件しかないから全件スキャンでいいや」
- 「こっちのテーブルは100万件あるから、インデックスを使って探そう」
プランナがこうやって「正しい判断」を下せるのは、データの中身を事前に把握しているからです。`pg_statistic` には、テーブルのデータが「どんな風に分布しているか(偏っているのか、均等なのか)」といった詳細なレポートが記録されています。
私たちが普段よく見る `pg_stats` という便利なビューは、この `pg_statistic` という「生データ」を、人間が読みやすい形に整えて表示してくれている「翻訳版」なんですよ。
「偏り」を知ることが最適化の鍵
例えば、「ユーザーの都道府県」という列があったとします。
データが全国に均等に散らばっているのか、それとも「東京都」に集中しているのか。もし「東京都」のデータが圧倒的に多いなら、プランナは「東京都」で検索するときだけ特別扱いしようと計画を練ります。
もしこの統計情報が古かったり、正確でなかったりしたらどうなるでしょう?
司書さんが「この図書館には東京都の本は1冊しかないはず!」と勘違いして、無駄な探し方をしてしまうのと同じ。これが、クエリが突然遅くなる原因の一つなんです。
統計情報と仲良くなるためのステップ
「じゃあ、この統計情報はどうやって最新にするの?」と気になった方、素晴らしい着眼点です!
基本的には、PostgreSQLには 「オートバキューム(autovacuum)」 というお掃除ロボットが標準で働いています。彼らが定期的に「最近データが増えたから、統計情報を更新しておこう!」と気を利かせてくれるおかげで、私たちは普段あまり意識せずに済んでいるんですね。
でも、もしクエリが遅いなと感じたら、以下のことを思い出してください。
- ANALYZEコマンドを試す: 「最近大量にデータを書き換えたから、統計情報が古いのかも?」と思ったら、手動で `ANALYZE テーブル名;` と打ってみてください。これだけで、プランナが「あ、今の状態はこうなってるんだ!」と目を覚まして、劇的に速くなることがあります。
—
最後に
`pg_statistic` は、普段は画面の裏側に隠れていて、決して表舞台には出てきません。でも、私たちのクエリが快適に動いているのは、この地味な統計情報が正確に保たれているからこそなんです。
「データベースがなんだか最近遅いな?」というときは、ぜひこの「統計情報の正確さ」を疑ってみてください。まるで、溜まっていたメールを整理して、頭をすっきりさせるような感覚でメンテナンスしてあげると、データベースもきっと喜んで応えてくれますよ。
また何か気になることがあれば、いつでも聞きに来てくださいね。それでは、楽しいDBライフを!
コメント