【入門編】 pg_statsビュー – PostgreSQL

なぜかクエリが遅い…そんな時、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` を通じてデータベースの「頭の中」を覗いてみてください。きっと、これまでとは違った視点でデータが見えてくるはずですよ!

それでは、また次回の記事でお会いしましょう。ハッピー・クエリライフを!

コメント

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