こんにちは!データベースの世界へようこそ。
普段、PostgreSQLを触っていると「なんだかクエリが遅いな……」と悩む瞬間、ありますよね。
そんなとき、多くのエンジニアが「インデックスを貼ろうかな?」とか「クエリの書き方を変えようかな?」と試行錯誤するわけですが、実は「データベースが何を知っているか」を覗き見ると、解決の糸口が見えることがよくあるんです。
今日は、PostgreSQLの頭脳とも言える「統計情報」の裏側、特に『pg_statistic』という少しミステリアスな場所について、お話ししてみようと思います。
—
データベースの「カンニングペーパー」
想像してみてください。あなたは、ものすごく膨大な資料が詰まった図書館の司書さんです。
お客さんから「〇〇というタイトルの本はどこにある?」と聞かれたとき、いちいち全ての棚を走り回って探しますか?……そんなことしたら、日が暮れちゃいますよね。
だから、司書さんは「どの棚にどんなジャンルの本があるか」をまとめた「索引(目次)」を持っています。
PostgreSQLも同じです。クエリを実行するとき、いちいち全てのデータを数えていたら時間がかかりすぎてしまいます。そこで、「このテーブルには大体これくらいのデータがあって、こういう傾向があるよ」というメモ帳を用意しているんです。これが「統計情報」です。
pg_statistic:直接触っちゃダメ!な秘密のファイル
PostgreSQLには、この統計情報を保存している『pg_statistic』という場所があります。いわば、データベースが自分専用に書いている「カンニングペーパー」そのものです。
ただ、ここで一つ注意点があります。
この『pg_statistic』という場所、実は人間が直接読むのには全く向いていません。データが暗号のように圧縮されていたり、計算用の特殊な形式で保存されていたりするんです。「このデータ、中身がどうなってるのか気になる!」と思って覗きに行っても、きっと「なんだこれ……?」と頭を抱えてしまうはず。
そこで、PostgreSQLは私たちに『pg_stats』という、とても読みやすい「翻訳版」を用意してくれています。
pg_stats ビューを使ってみよう
「直接見るのはやめてね」と言われたときは、素直にその「翻訳版」である『pg_stats』を使いましょう。これなら、SQLで普通に検索するだけで、データベースが今どんなことを考えているのかが一目瞭然です。
例えば、こんなクエリを打ってみてください。
SELECT tablename, attname, n_distinct, most_common_vals
FROM pg_stats
WHERE tablename = ‘あなたのテーブル名’;
これを見ると、面白いことがわかります。
- n_distinct: この列には、どれくらいバラエティに富んだ値が入っているか?
- most_common_vals: よく登場する値は何なのか?
データベースはこれを見ながら、「よし、今回の検索はこっちのルートを通った方が早そうだぞ!」と、頭の中でルート案内(実行計画)を組み立てているんです。
なぜ統計情報が古くなると「遅く」なるの?
たまに、「前は速かったのに、最近急にクエリが遅くなった」なんてことが起きますよね。
その原因の多くは、この統計情報が「今の現実とズレてしまっていること」にあります。
図書館の例でいえば、新しい本が大量に入ったのに、目次が古いまま……みたいな状態です。データベースは「たぶんこのデータは少ないはずだ」と思い込んで効率の悪いルートを選んでしまい、結果として時間がかかってしまうんです。
そんなときは、`ANALYZE`コマンドを実行してあげてください。
「最新の状況を確認して、カンニングペーパーを書き直してね!」というお願いです。これだけで、嘘みたいにクエリが速くなることも珍しくありません。
—
最後に:データベースと仲良くなるために
「クエリチューニング」って、なんだか難しそうな響きですよね。でも、やっていることは意外とシンプルなんです。
「データベースが今、何を信じているのかを知る」
これだけで、トラブルの半分以上は解決の糸口が見えてきます。『pg_stats』は、そんなデータベースの心の声を聞くための、一番の近道です。
ぜひ、皆さんのデータベースの「カンニングペーパー」も、たまに覗いてみてくださいね。きっと、今まで以上に仲良くなれるはずですよ!
それでは、また次回の記事でお会いしましょう!
コメント