【入門編】 統計ターゲット (default_statistics_target) – PostgreSQL

こんにちは!データベースの世界へようこそ。
普段、PostgreSQLを触っていて「なんだかクエリの動きが遅いな……」と感じることはありませんか?実はそれ、データベースがデータのことを「なんとなく」でしか把握できていないからかもしれません。

今日は、そんなモヤモヤを解消する秘密の隠し味、`default_statistics_target` という設定について、お話ししたいと思います。

—

データベースは「優秀な秘書」だけど…

皆さんの代わりに膨大なデータを管理してくれるデータベースは、いわば「超優秀な秘書」です。でも、どんなに優秀な秘書でも、「今、手元にどんなデータがどれくらいあるか」を知らなければ、最適な仕事はできませんよね。

PostgreSQLは、定期的に `ANALYZE` というコマンドを実行して、データの分布状況(「大体この値はこれくらいあるな」というメモ)を記録しています。これが「統計情報」です。

「ざっくり」か「精密」か、それが問題だ

この統計情報、デフォルトのままだと、実はちょっとだけ「ざっくり」としたメモなんです。

例えば、あるお店の「売れた商品のリスト」を想像してみてください。

  • ざっくりメモ: 「だいたい、A商品は100個くらい売れてるかな!」
  • 精密メモ: 「A商品は月曜に10個、火曜に15個、水曜に5個……合計100個!」

もし皆さんが仕入れの計画を立てるなら、どちらのメモが役立ちますか? もちろん、後者のほうが正確な計画を立てられますよね。

PostgreSQLも同じです。データの分布が複雑な列(例えば、特定の日だけ異様に売れる商品や、偏った年齢層のユーザーデータなど)があるとき、デフォルトの「ざっくりメモ」だと、プランナ(クエリの実行順序を決める司令塔)が「この検索なら、この道順でいくのが速い!」という判断を間違えてしまうことがあるんです。

`default_statistics_target` を調整してみよう

そこで登場するのが `default_statistics_target` です。これは、「統計情報を取るときに、どれくらい細かく記録するか」を決める設定値です。

  • デフォルトは「100」: 多くのケースではこれで十分です。
  • 数値を上げると(例:500や1000): ヒストグラムがより細かくなり、データの偏りを見逃さなくなります。

これを増やすと、データベースは「おっ、このデータはこんなに細かく分かれているのか!」と正しく理解できるようになり、結果としてクエリが爆速になる……なんていう劇的な改善が起こることもあります。

ただし、ちょっとだけ注意点も

「じゃあ、全部の値を高くしちゃえば最強じゃない?」と思いますよね。でも、ちょっと待ってください。

  • 収集に時間がかかる: 統計を取る作業そのものが重くなってしまいます。
  • メモリを消費する: 細かいメモをたくさん持つと、それだけデータベースの頭の中(メモリ)が圧迫されます。

日常の掃除と同じで、隅々までピカピカにしすぎると、毎日のお掃除が大変になってしまうのと似ていますね。

まずは「どこが怪しいか」を見つけることから

いきなり全体の設定をいじり回すのは、ちょっと危険です。まずは、本当に困っている特定の列だけをピンポイントで調整するのが、プロのやり方です。

PostgreSQLには、特定の列だけ統計の精度を変える魔法のコマンドがあります。

ALTER TABLE テーブル名 ALTER COLUMN 列名 SET STATISTICS 500;

こうすることで、「ここのデータは複雑だから、しっかり見ておいてね!」とデータベースにお願いすることができるんです。

—

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

統計情報の調整は、いわば「データベースとの対話」です。
「君は今、どんなデータを持っているの?」と優しく気にかけてあげて、もし判断を間違えているようなら、統計ターゲットというヒントを与えてあげる。そうやって少しずつチューニングしていく過程は、実はすごく楽しい作業なんですよ。

皆さんのデータベースが、今日も元気に、そして賢く動いてくれますように!
何か分からないことがあれば、またいつでも聞きに来てくださいね。それでは、素敵なエンジニアライフを!

コメント

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