【入門編】 統計情報収集 – PostgreSQL

「勘」で走るクエリは迷子になる?PostgreSQLの統計情報という「地図」の話

こんにちは!データベースの世界へようこそ。

日々PostgreSQLを触っていると、「あれ、昨日まで速かったクエリが急に重くなったぞ?」なんて経験、一度はありませんか?実はそれ、データベースが「地図をなくして迷子になっている状態」かもしれません。

今日は、そんなデータベースの迷子を防ぐための超重要アイテム、「統計情報」についてお話しします。難しそうに聞こえるかもしれませんが、日常の出来事に例えるとすごくシンプルなんですよ。

—

「適当な料理」と「統計情報」

想像してみてください。あなたは今、ものすごく空腹で、冷蔵庫にあるものでチャーハンを作ろうとしています。

  • 統計情報がない状態(勘で料理):

「たぶん卵は2個あるはず…あ、1個しかなかった!野菜も…えっ、キャベツはこれだけ?」。結局、途中で買いに行ったり、足りない材料で無理やり作って味が微妙になったりしますよね。これ、データベースがクエリを処理する時と同じなんです。

  • 統計情報がある状態(完璧な在庫管理):

「今、冷蔵庫には卵が3個、キャベツが半分、ハムが4枚ある」と完璧に把握していれば、「よし、今日はハムと卵のチャーハンにしよう」と、一番効率的なレシピをすぐに決められますよね。

PostgreSQLにおける「統計情報」とは、まさにこの「冷蔵庫の中身リスト」のこと。
テーブルに何行データが入っていて、どんな値がどれくらい含まれているか。これをPostgreSQLが正確に把握しているからこそ、無駄のない最高のルート(実行計画)を導き出せるんです。

—

なぜこれが重要なのか?

PostgreSQLは非常に賢い「プランナ(計画係)」を抱えています。このプランナが、私たちが投げた「このデータを探して!」という命令に対して、「よし、まずはインデックスを使って…次はこうして…」と、一番速い手順を組み立ててくれます。

しかし、このプランナが使う「地図」である統計情報が古かったらどうでしょう?

  • 「本当は100万件あるデータなのに、統計情報が更新されていなくて『10件しかない』と思い込んでいる」
  • 「特定の値が偏っているのに、均等に散らばっていると勘違いしている」

こうなると、プランナは「10件なら全件検索しちゃえ!」という無謀な作戦を立ててしまい、結果としてサーバーが悲鳴を上げてしまうわけです。これ、本当によくあるトラブルの筆頭なんですよ。

—

統計情報を味方につけるための「魔法の呪文」

PostgreSQLは、実は自動的にこの統計情報を更新してくれる機能(自動バキューム:`autovacuum`)を持っています。基本的には、何もせずとも「冷蔵庫の中身」は最新に保たれるようになっています。

でも、大量のデータを一気に書き換えたり、削除したりした直後は、この自動更新が追いつかないことがあります。そんな時は、私たちエンジニアが手動で「今の状況を確認して!」と伝えてあげましょう。

それが、このコマンドです。

ANALYZE テーブル名;

これだけで、PostgreSQLは慌てて冷蔵庫の中身を確認しに行き、最新の「地図」を作り直してくれます。クエリが遅いな?と感じた時、まず試すべき魔法の呪文ですね。

—

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

データベースは決して意地悪な機械ではありません。私たちが「今の状態はこうだよ」と正しい情報を教えてあげれば、驚くほど速く、正確に応えてくれます。

  • 統計情報は、データベースが走るための「最新の地図」
  • 地図が古いと、どんなに高性能なデータベースでも迷子になる
  • 「遅いな」と思ったら、まずは `ANALYZE` で情報を更新してあげる

これだけ覚えておけば、もうデータベースのパフォーマンスに振り回されることは少なくなりますよ!

ぜひ、皆さんのデータベースの「冷蔵庫」を覗くような気持ちで、統計情報と付き合ってみてくださいね。それでは、また次回の記事でお会いしましょう!

コメント

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