【入門編】 pg_statisticシステムカタログ – PostgreSQL

こんにちは!データベースの世界へようこそ。
普段、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』は、そんなデータベースの心の声を聞くための、一番の近道です。

ぜひ、皆さんのデータベースの「カンニングペーパー」も、たまに覗いてみてくださいね。きっと、今まで以上に仲良くなれるはずですよ!

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

コメント

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