こんにちは!データベースの世界へようこそ。
今日は、PostgreSQLという「優秀な料理長」が、どうやって効率よく料理(クエリ)を作っているのか、その裏側の秘密を覗いてみようと思います。
データベースを触り始めたばかりの頃、「なぜか検索が遅いな?」と感じたことはありませんか?実はそれ、料理長が「冷蔵庫の中身」を把握できていないせいかもしれません。
—
料理長は「メモ帳」を頼りにしている
PostgreSQLには「クエリプランナー」という頭脳明晰なシェフがいます。彼がSQLという注文を受けると、「どうやって一番速くデータを取り出そうかな?」と瞬時に計算します。
でも、彼も人間(…じゃないけれど)ですから、すべてを暗記しているわけではありません。そこで役立つのが「統計情報」というメモ帳です。
このメモ帳には、こんなことが書かれています。
- このテーブルには、全部で何行データがあるか?
- 「名前」の列には、どれくらい重複したデータがあるか?
- どの値がよく検索されるか?
もしこのメモ帳が古かったら?「あ、最近仕入れた食材(データ)の在庫数を把握してなかった!」と、シェフは勘違いして、非効率な手順で料理を作ってしまうことになります。これが「クエリが遅い」原因の正体です。
—
ANALYZEってなに?
この「メモ帳」を最新の状態に更新する魔法のコマンド、それが `ANALYZE` です。
イメージとしては、シェフが「よし、ちょっと冷蔵庫の在庫チェックをしよう!」と言って、中身を再確認する作業のこと。これを実行することで、PostgreSQLはテーブルの状況を正確に把握し、最適な実行計画を立てられるようになります。
「自動」でやってくれることもあるけれど…
PostgreSQLには「オートバキューム」という便利な機能があって、データがたくさん増えたり更新されたりすると、勝手に`ANALYZE`を実行してくれる賢い仕組みがあります。
でも、以下のタイミングでは、自分から「おい、今すぐ確認して!」と声をかけてあげたほうがいいこともあります。
- 大量のデータを一気にインポートした直後:
急に冷蔵庫にトラックいっぱいの食材が届いたような状態です。シェフに「これ全部使っていいよ!」と教えてあげないと、彼は混乱してしまいます。
- データの傾向がガラリと変わったとき:
例えば、それまで数件しかデータがなかったテーブルに、数万件のデータが入った場合などです。
—
統計情報の正体「pg_statistic」
データベースの中には、このメモ帳の中身を覗ける場所があります。それが `pg_statistic` というシステムカタログ(ビュー)です。
ただ、正直に言うと、ここを直接眺めるのはちょっと上級者向けです。なぜなら、中身は人間には少し読みづらい形式で保存されているからです(笑)。
でも、知っておいてほしいのは「ここにシェフが愛用する『統計情報』という名の攻略本が眠っている」ということだけ。データベースのパフォーマンスチューニングの第一歩は、ここを信頼できる状態に保つことから始まります。
—
今日のまとめ
- クエリプランナー(シェフ)は、統計情報(メモ帳)を見て計画を立てている。
- データが大きく変わったら、`ANALYZE`でメモ帳を更新してあげよう。
- そうすれば、シェフは常に最高のパフォーマンスで料理を提供してくれる!
「最近、なんだかクエリの動きが鈍いな?」と思ったら、慌ててインデックスを追加する前に、まずは「`ANALYZE テーブル名;`」と唱えてみてください。それだけで、まるで魔法のように検索が速くなることも珍しくありません。
データベースと仲良くなるコツは、シェフであるPostgreSQLに「今の状況」をこまめに伝えてあげること。そうすれば、きっとあなたの頼もしいパートナーになってくれるはずですよ!
それでは、また次回の記事でお会いしましょう!
コメント