こんにちは!データベースの世界へようこそ。
現場でバリバリとデータベースを触っていると、「あれ?さっきまで爆速だったクエリが、急にノロノロになってる……」なんて場面に出くわすことがあります。そんな時、多くのエンジニアが最初に疑うのが「統計情報」です。
今日は、PostgreSQLがクエリを組み立てる際に使っている「裏側の秘密のメモ帳」について、専門用語を極力使わずにお話ししますね。
—
料理のレシピと「冷蔵庫の在庫表」
皆さんがカレーを作ると想像してみてください。
冷蔵庫にじゃがいもが3個あるのか、それとも30個あるのか。それによって、調理手順(鍋のサイズや火加減)はガラッと変わりますよね。
PostgreSQLもこれと全く同じことをしています。
クエリ(SQL)を実行する時、データベースは「どうやってデータを取ってくるのが一番効率的かな?」とプラン(実行計画)を立てます。でも、データがどれくらいあるかを知らないと、最適なプランなんて立てられません。
そこで登場するのが、PostgreSQLがこっそり持っている「統計情報」というメモ帳なんです。
—
覗いてみよう!PostgreSQLの「メモ帳」たち
PostgreSQLは、テーブルの状況を把握するために、いくつか情報を格納する場所を持っています。
1. `pg_stats` :一番身近な「お役立ちサマリー」
これは、人間が見ても分かりやすいように加工された「要約表」です。
「このカラムにはどんなデータが入っているか」「よく使われる値はどれか」といった情報が、まるで商品棚の在庫リストのように綺麗にまとめられています。
- 「この列には、0から100までの数字が均等に入ってるな」
- 「この列は『東京都』というデータが異常に多いな」
といった具合です。プランナ(実行計画を作る人)は、クエリを実行する前にまずこのリストをチラッと見て、「よし、今回はこの方法で行こう!」と決めているんです。
2. `pg_class` :「テーブルの基本スペック表」
こちらは、もっと大きな枠組みの情報です。「このテーブルには全部で何行くらいデータがあるか」「インデックスはどれくらいサイズがあるか」といった、いわば「建物の設計図や規模」が書いてあります。
3. `pg_statistic` :「機械のための生データ」
実は `pg_stats` の裏側には、`pg_statistic` というテーブルが存在します。こちらは機械が読み取って判断するための「生データ」のような場所で、人間が直接読むには少し暗号みたいで大変です。基本的には `pg_stats` を通して状況を確認するのがおすすめですよ。
—
なぜ、統計情報がズレちゃうの?
ここからが重要です。なぜ、さっきまで速かったクエリが急に遅くなるのか。
それは、「メモ帳の更新が追いついていないから」です。
想像してみてください。冷蔵庫の中身を全部入れ替えたのに、メモ帳には「じゃがいも30個」と書かれたままだったら……。実際には空っぽなのに、無理やり大量のカレーを作ろうとして大パニックになりますよね。
データベースも同じで、大量のデータを追加・削除したあと、メモ帳(統計情報)を最新に更新してあげないと、的外れな実行計画を立ててしまうんです。
—
困ったときの「魔法の呪文」
もし、「なんだか最近クエリが遅いな?」と感じたら、まずはこの魔法の呪文を思い出してください。
ANALYZE;
これです。このコマンドを打つと、PostgreSQLは慌てて冷蔵庫の中を再チェックして、最新の状況をメモ帳に書き込んでくれます。これだけで嘘みたいにパフォーマンスが改善することがよくあります。
—
最後に:データベースと仲良くなるために
統計情報は、データベースが賢く振る舞うための「命綱」です。
最初は難しそうに見えるかもしれませんが、「PostgreSQLも、私たちと同じように『正確な情報』がないと良い仕事ができないんだな」と考えてみてください。
「急に遅くなった!」というトラブルが起きたとき、ぜひこの記事を思い出して、統計情報のことを気にかけてあげてくださいね。そうすれば、きっとあなたのデータベースはもっと快適に動いてくれるはずです。
それでは、また次回の記事でお会いしましょう!Happy Querying!
コメント