なぜかクエリが遅い…そんな時、PostgreSQLに「頭の中」を覗かせよう!
皆さん、こんにちは!普段データベースを触っていると、「さっきまでサクサク動いていたはずなのに、急に重くなったぞ?」なんて経験、一度はありますよね。
そんな時、僕たちエンジニアは真っ先に「SQLの書き方が悪いのかな?」とか「インデックスがないのかな?」と悩みます。でも実は、データベース自身が状況を勘違いしている、というケースが意外と多いんです。
今日は、そんな「データベースの思い込み」を解き明かすための秘密道具、`pg_stats` ビューについてお話しします。
—
「料理のレシピ」を勘違いしているシェフ
例え話をしましょう。あなたがレストランのオーナーだと想像してください。厨房には「シェフ(PostgreSQL)」がいて、料理のオーダー(クエリ)をさばいています。
本来なら、シェフは冷蔵庫の中に「何がどれくらいあるか」を把握して、効率よく調理しますよね。でも、もしシェフが「今の冷蔵庫には、たまねぎが1個しかない」と思い込んでいたとしたらどうでしょう?
実際には山ほどあるのに、「1個しかない」と信じているシェフは、大勢の客にカレーを出すために、わざわざ手間のかかる別の方法を選んでしまったりします。これこそが、データベースがクエリを遅くしてしまう原因の一つ、「統計情報のズレ」なんです。
`pg_stats` は「冷蔵庫の在庫管理表」
このシェフ(PostgreSQL)が、ちゃんと在庫を把握しているか確認できるのが `pg_stats` というビューです。
`ANALYZE` というコマンドを打つと、PostgreSQLは一生懸命冷蔵庫を点検して、「今、キャベツは何個あって、どんな鮮度か」といった情報をこの `pg_stats` に書き込みます。
この中身を覗くと、シェフが何をどう勘違いしているのかが一目瞭然になるんです。
チェックすべき2つのポイント
`pg_stats` の中にはたくさんの情報が詰まっていますが、特に注目してほしいのはこの2つです。
- MCV (Most Common Values):よく出る値
「この食材、よく使うよね」という上位メンバーのリストです。もしここが古いと、シェフは「最近キャベツなんて誰も頼まないよ」と決めつけてしまいます。
- ヒストグラム:データの分布
「データの偏り」を教えてくれるグラフみたいなものです。「年齢層は20代が多いのか、それともバラバラなのか」といった傾向を把握します。
実際に覗いてみよう!
もしクエリが遅いなと感じたら、まずはこうやって中身を見てみましょう。
SELECT tablename, attname, most_common_vals, histogram_bounds
FROM pg_stats
WHERE tablename = ‘あなたのテーブル名’;
これを見るだけで、「あれ?このデータ、もっとたくさんあるはずなのに、統計情報上は極端に少ないことになってるぞ?」といった発見があるはずです。
困った時の解決策は意外とシンプル
もし `pg_stats` の内容と実際のデータがズレていたら、どうすればいいでしょうか?
答えは簡単。「もう一度、冷蔵庫をチェックして!」と命令するだけ。そう、`ANALYZE` コマンドをもう一度実行して、統計情報を最新に更新してあげるんです。
これだけで、シェフの思い込みが解消されて、劇的にクエリが速くなることは珍しくありません。
—
最後に:データベースと仲良くなるために
「データベースのチューニング」と聞くと、なんだか難しそうな呪文を唱えるようなイメージがあるかもしれません。でも、実際は「データベースという優秀なシェフが、ちゃんと現状を把握できているかを確認してあげる」という、ちょっとしたコミュニケーションのようなものなんです。
ぜひ皆さんも、クエリが遅いなと思ったら、`pg_stats` を通じてデータベースの「頭の中」を覗いてみてください。きっと、これまでとは違った視点でデータが見えてくるはずですよ!
それでは、また次回の記事でお会いしましょう。ハッピー・クエリライフを!
コメント