こんにちは!データベースの世界へようこそ。
普段、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を劇的に速くする魔法の鍵になるはずですよ!
それでは、また次回の記事でお会いしましょう。ハッピー・クエリチューニング!
コメント