【入門編】 統計情報の精度(default_statistics_target) – PostgreSQL

「あれ、検索が遅い?」と思ったら。PostgreSQLの「勘」を育てる『statistics_target』の話

こんにちは!データベースの世界に足を踏み入れたばかりのみなさん、日々のお仕事や学習、お疲れ様です。

PostgreSQLを触っていると、最初はサクサク動いていたはずのクエリが、データが増えるにつれて急に「重く」なること、ありますよね。そんな時、多くの人が「インデックスが足りないのかな?」と悩むのですが、実は「データベースが勘違いをしている」というケースが意外と多いんです。

今日は、そんなデータベースの「勘」を鋭くするための、ちょっとしたチューニングのコツをお話しします。

—

データベースは「目隠し」をして計算している?

みなさんが料理をする時を想像してみてください。
冷蔵庫の中に卵が何個あるか、正確に把握していれば「オムライスを作るのに十分だな」とすぐに判断できますよね。でも、もし「だいたい3〜10個くらいかな…」という曖昧な記憶(勘)で料理をしていたらどうでしょう?

「とりあえず卵を1個だけ使おう」とか「全部使っちゃえ!」と無駄な動きをして、結果的に時間がかかってしまいますよね。

PostgreSQLもこれと同じなんです。検索を実行する前、データベースは「どの道順(実行計画)でデータを探しに行くのが一番早いか」を計算します。その際、「この列には、どんなデータがどれくらい入っているのか」という統計情報という名の「メモ帳」を頼りにします。

このメモ帳が荒いと、データベースは的外れな計画を立ててしまい、クエリが劇的に遅くなるんです。

—

魔法のパラメータ『default_statistics_target』

そこで登場するのが、今回ご紹介する『default_statistics_target』という設定値です。

これは、データベースがデータを観察する時の「解像度」を決めるスイッチのようなもの。デフォルトでは「100」という値になっています。これは「ヒストグラム(データの分布図)を100個のバケット(箱)に分けて把握するよ」という意味です。

  • 値が小さい(デフォルトのまま):ざっくりとした把握。計算は速いけど、細かいデータの偏りを見逃しやすい。
  • 値を大きくする:細かく観察する。計算に少し時間はかかるけど、複雑なデータ分布も正確に把握できる。

「じゃあ、全部の列を1000とか10000にすれば最強じゃない?」と思いますよね。でも、そうすると今度は統計情報を更新する(ANALYZE)たびにデータベースが疲弊してしまいます。何事もバランスが大切なんです。

—

こんな時に調整してみよう

もし、以下のような状況に心当たりがあれば、このパラメータを調整するチャンスかもしれません。

  • 「特定の条件で検索したときだけ、なぜか極端に遅い」
  • 「データが極端に偏っている列(例:フラグが99%『0』で、1%だけ『1』というような列)がある」

そんな時は、特定の列だけ、観察の密度を上げてあげましょう。

— この列は重要だから、細かく見ておいてね!と指示するコマンド
ALTER TABLE テーブル名 ALTER COLUMN 列名 SET STATISTICS 500;

こうするだけで、データベースは「あ、この列のデータはこういう偏り方をしてたのか!」と気づき、最適な検索経路を選べるようになります。まるで、近眼だったデータベースに眼鏡をかけてあげるような感覚ですね。

—

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

チューニングと聞くと難しそうに感じるかもしれませんが、要は「データベースにどれだけ正確な情報を与えてあげるか」というコミュニケーションの問題なんです。

1. クエリが遅いときは、まず統計情報が古いかもしれないと疑ってみる。
2. それでもダメなら、データの分布が複雑すぎて「勘」が外れている可能性を考える。
3. `default_statistics_target` で観察の解像度を調整して、データベースの「視力」を上げてあげる。

これだけで、システムのパフォーマンスは驚くほど変わることがあります。ぜひ、みなさんの環境でも試してみてくださいね。

それでは、また次回のブログでお会いしましょう!データベースとの素敵な付き合い方が見つかりますように。

コメント

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