【入門編】 default_statistics_targetの役割 – PostgreSQL

こんにちは!データベースエンジニアの日常へようこそ。

今日は、PostgreSQLのパフォーマンス改善において、実はめちゃくちゃ重要なのに意外と見落とされがちな「`default_statistics_target`」という設定についてお話ししようと思います。

「統計情報?」「デフォルト??」なんて聞くと難しく感じるかもしれませんが、大丈夫。実はこれ、私たちの日常生活にすごく近い考え方なんです。

—

料理の買い出し、勘だけで行っていませんか?

想像してみてください。あなたは今夜の夕食を作ろうとしています。

もし、冷蔵庫の中身を全く確認せずに「たぶん卵はあるだろう」「野菜もなんとなく足りるはず」と勘だけでスーパーに行ったらどうなるでしょう?
家に帰ってから「あ、卵がない!」とか「ネギが多すぎた!」なんて失敗、一度は経験したことありますよね。

データベースもこれと同じなんです。PostgreSQLがクエリを実行するとき、「このテーブルには、だいたい何行くらいのデータが入っているかな?」と予想(見積もり)を立てる必要があります。この予想が外れると、とんでもない時間がかかる「非効率な検索ルート」を選んでしまうんです。

「統計情報」は、冷蔵庫のメモ書き

PostgreSQLが賢い判断をするために使っているのが「統計情報」です。
これは、`ANALYZE`というコマンドを実行することで、データベースが「今、どんなデータがどれくらい入っているか」をチェックして作る、いわば冷蔵庫の中身リストのようなものです。

そして、今回の主役である `default_statistics_target` は、「このメモをどれくらい細かく書くか」を決める設定値なんです。

  • 値が小さい(デフォルトの100くらい):

「大まかに把握する」設定。ざっくりとした傾向はわかるので、たいていの場合はこれで十分。素早くメモが作れます。

  • 値が大きい:

「かなり細かく分析する」設定。データの偏りまで深く調べるので、メモの精度は上がりますが、リストを作る(ANALYZEする)のに時間がかかります。

—

なぜ「精度」が重要なのか?

例えば、会員データで「都道府県」カラムを検索するとします。

  • 東京には100万人いるけど、鳥取には1万人しかいない。
  • このような「データの偏り」があるとき、デフォルトのざっくりしたメモだと、プランナ(検索の司令塔)は「どっちの県も同じくらいだろう」と勘違いしちゃうことがあるんです。

結果として、「全件を順番に探したほうが速い」はずのケースで「インデックスをわざわざ読みに行く」という遠回りをしてしまったりします。これが、クエリが遅くなる大きな原因の一つです。

どうやって付き合えばいい?

じゃあ、常に数値を最大にしておけば最強じゃん!……と言いたいところですが、そうもいきません。
細かく調べれば調べるほど、統計情報を更新するたびにデータベースに負荷がかかってしまいます。

まずは、こんなステップで考えてみてください。

1. 基本はそのまま: 大半のシステムではデフォルト設定のままで十分パフォーマンスが出ます。
2. 「なんか遅いな?」と思ったら: 特定のカラムだけ検索が遅い場合、そのカラムのデータの偏りが激しい可能性があります。
3. 個別に調整する: `default_statistics_target` を全体的にいじるのではなく、特定のお困りカラムだけ、以下のようなコマンドで「濃い目に分析してね!」と指定するのがプロのテクニックです。

— 特定のカラムだけ、統計情報の精度を上げる例
ALTER TABLE ユーザーテーブル ALTER COLUMN 都道府県 SET STATISTICS 500;

—

最後に

データベースの設定って、完璧を目指すとキリがないもの。でも、「PostgreSQLがデータの偏りを正確に把握できているか?」という視点を持てると、クエリチューニングの景色がガラッと変わります。

もし皆さんのデータベースで「なぜかこの検索だけ遅いんだよな…」という悩みがあれば、ぜひ「統計情報の精度」を疑ってみてください。

それでは、また次回のブログでお会いしましょう。ハッピーなデータベースライフを!

コメント

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