こんにちは!データベースの世界へようこそ。
普段、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;
こうすることで、「ここのデータは複雑だから、しっかり見ておいてね!」とデータベースにお願いすることができるんです。
—
最後に:データベースと仲良くなるために
統計情報の調整は、いわば「データベースとの対話」です。
「君は今、どんなデータを持っているの?」と優しく気にかけてあげて、もし判断を間違えているようなら、統計ターゲットというヒントを与えてあげる。そうやって少しずつチューニングしていく過程は、実はすごく楽しい作業なんですよ。
皆さんのデータベースが、今日も元気に、そして賢く動いてくれますように!
何か分からないことがあれば、またいつでも聞きに来てくださいね。それでは、素敵なエンジニアライフを!
コメント