【入門編】 相関統計情報 – PostgreSQL

こんにちは!データベースの世界へようこそ。
普段、SQLを書いていると「あれ?なんでこんなにクエリが遅いの?」と頭を抱えること、ありますよね。実はその原因、データベースが「勘違い」をしているからかもしれません。

今日は、PostgreSQLがもっと賢く動くための「相関統計情報(Extended Statistics)」というちょっと気の利いた機能について、身近な例えで解説していきますね。

—

データベースの「勘違い」はなぜ起きる?

まず、データベースがどうやってクエリを処理しているか想像してみてください。データベースは、あなたが投げたSQLを実行する前に、「この条件だと、だいたいこれくらいのデータが返ってくるはずだな」と、事前に「行数の見積もり」をします。

この見積もりに基づいて、「今回はこのインデックスを使おう」とか「先にこっちのテーブルを結合しよう」といった作戦(実行計画)を立てるんです。

でも、この見積もりがズレると、途端にどんくさい作戦を立ててしまいます。これ、実は「カラム同士の仲の良さ」を見落としていることが原因なんです。

—

「カレー」と「福神漬け」の例え

例えば、あなたがスーパーの店長さんだとしましょう。ある日、「カレー」と「福神漬け」の売れ行きを分析することになりました。

ここで、「カレーを買う人」と「福神漬けを買う人」の数をそれぞれ数えて、単純に掛け合わせるとどうなるでしょうか?

  • カレーを買う人:全体の10%
  • 福神漬けを買う人:全体の10%
  • 「カレー」かつ「福神漬け」を買う人:10% × 10% = 1%!

……でも実際はどうでしょう? カレーを買う人は、高い確率で福神漬けも手に取りますよね。実際にはもっと多くの人が両方買っているはずです。

データベース君は、この「カレーを買う人なら、福神漬けも高確率で買う」という情報の相関(結びつき)を知らないと、「カレーと福神漬けを両方買う人は1%くらいだろ!」と大間違いな見積もりをしてしまうんです。

これが、クエリが遅くなる大きな原因の一つです。

—

そこで登場するのが「相関統計情報」

PostgreSQLには、この「カレーと福神漬け」のような関係性を教えてあげる仕組みがあります。それが「相関統計情報(Extended Statistics)」です。

これを使って、「このカラムとこのカラムはセットで見ることが多いから、その相関関係を覚えておいて!」と指示を出すと、データベースはこう変わります。

1. 以前のデータベース: 「それぞれ独立したイベントだから、確率を掛け算しよう。1%だ!」
2. 相関統計を知った後のデータベース: 「あ、この2つはセットになりやすいんだね。じゃあ、実際はもっと多い……例えば8%くらいだな!」

こうやって、より現実に近い見積もりができるようになると、プランナ(作戦担当者)は自信を持って最適なルートを選択できるようになるんです。

—

どうやって設定するの?

難しいコマンドを覚える必要はありません。例えば、「都市名(city)」と「郵便番号(zip_code)」のように、片方がわかればもう片方も大体決まるような関係がある場合、こんなふうに伝えてあげるだけです。

CREATE STATISTICS stats_city_zip (dependencies)
ON city, zip_code FROM your_table;

これだけで、PostgreSQLは「なるほど、この2つはセットで考えなきゃいけないんだな」と学習を始めてくれます。

—

まとめ:データベースと仲良くなるために

データベースは、私たちが思っている以上に「統計」という数字の世界で生きています。でも、現実世界の複雑な結びつきまでは、黙っていると気づいてくれません。

もしクエリが遅くて悩んだら、「このカラムとあのカラム、実は深い関係があるんだけど、データベースは気づいてるかな?」と一度立ち止まって考えてみてください。

その小さな気づきが、あなたの書くSQLを劇的に速くする魔法の鍵になるはずですよ!

それでは、また次回の記事でお会いしましょう。ハッピー・クエリチューニング!

コメント

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