クエリの「迷子」を防ぐ!PostgreSQLの隠れた司令塔「pg_statistic」の話
こんにちは!データベースエンジニアとして日々PostgreSQLと向き合っていると、「あれ、なんでこのクエリこんなに遅いの?」という壁にぶつかることがよくありますよね。
そんな時、たいていの原因は「データベースがデータのことをよく知らないから」だったりします。今日は、PostgreSQLが自分自身の知識を蓄えている秘密のメモ帳、「pg_statistic」について、難しい専門用語は抜きにしてお話ししてみようと思います。
—
「適当に選んで」と言われたら、どう動く?
たとえば、あなたが友人から「この巨大な本棚から、適当に本を1冊探しておいて」と頼まれたとします。
もしあなたが「この本棚には、どんなジャンルの本が何冊あって、どこに何が置いてあるか」を完璧に把握していたら、迷わず目的の場所に直行できますよね。でも、中身を全く知らない本棚だったらどうでしょう?端から1冊ずつめくっていくしかありません。これって、すごく時間がかかりますよね。
データベースもこれと全く同じなんです。
SQLで「このデータを探して!」と命令したとき、PostgreSQLの「プランナ(計画係)」が最短ルートを見つけてくれるのですが、そのために必要なのが「データの分布図(統計情報)」なんです。
pg_statisticは「情報の宝庫」
この「データの分布図」が保管されている場所が、`pg_statistic`というシステムカタログです。
`ANALYZE`というコマンドを実行したとき、PostgreSQLはテーブルの中身をササッとチェックして、「この列にはどんな値が入っているか」「一番多い値はどれか」「スカスカな列はないか」といったメモをこの`pg_statistic`に書き込みます。
具体的には、こんなことをメモしています。
- 「この列には、Aという値が全体の6割を占めていて、Bはほとんどないよ」
- 「この列は値のバリエーションがすごく多いから、範囲で絞り込むと効率がいいよ」
- 「この列、実は空っぽ(NULL)のデータが半分くらいあるよ」
プランナは、クエリを実行する直前にこのメモ帳をパッと開いて、「なるほど、データがこう偏っているなら、インデックスを使ったほうが早そうだな」とか「全件調べたほうが早そうだ」といった戦略を練るわけです。
なぜこれが重要なのか?
もし、この`pg_statistic`が古いままだったり、データが偏りすぎていてメモが不十分だったりするとどうなるでしょうか?
プランナは、「本当はすごく少ないデータしかないのに、たくさんあると勘違いする」あるいはその逆のミスを犯します。その結果、本来なら一瞬で終わるはずのクエリが、永遠に終わらないような「大回りなルート」を選んでしまう……これがクエリが遅くなる大きな原因のひとつなんです。
初心者のうちに覚えておいてほしいこと
皆さんに一つだけ覚えておいてほしいのは、「データベースに『定期的に健康診断(ANALYZE)』を受けさせる」という習慣です。
PostgreSQLには「オートバキューム」という優秀な機能があるので、基本的には自動でやってくれますが、大量のデータを一気に書き込んだりした直後は、手動で`ANALYZE`をかけてあげると、データベースが最新の統計情報を持って、「今のデータならこう動くのが一番だね!」と賢い判断をしてくれるようになります。
—
データベースを単なる「箱」だと思うと難しく感じますが、「優秀だけど、時々ドジを踏む秘書」だと思ってあげてください。
私たちが`pg_statistic`(統計情報)という形で正しい情報を与えてあげれば、秘書は最高のパフォーマンスを発揮してくれます。この「見えないデータ」を意識するようになると、データベースとの付き合い方がぐっと楽しくなりますよ!
それでは、また次回のブログでお会いしましょう。ハッピー・クエリライフを!
コメント