【入門編】 カラム単位の統計情報設定 – PostgreSQL

データベースが「勘違い」してしまう時、どうすればいい?

こんにちは!日々のデータベース運用、お疲れ様です。

突然ですが、皆さんはこんな経験ありませんか?
「普段はすごく速いクエリなのに、特定の条件で検索した時だけ、なぜか異様に遅くなる……」

これ、データベースエンジニアの現場では「あるある」な悩みなんです。実はこれ、データベースが「データの偏り」をうまく読み取れていないことが原因かもしれません。

今日は、そんな時に魔法のように効く「カラム単位の統計情報設定」というテクニックを、難しい言葉抜きで解説していきますね。

—

「適当な見取り図」が招く悲劇

想像してみてください。あなたは巨大な図書館の司書さんです。
ある日、お客さんから「『料理』の本を探して」と頼まれました。

普段なら、あなたは「料理の本ならあっちの棚だ!」と即座に案内できますよね。ところが、もしあなたの持っている「館内の見取り図」が、ざっくりとした手書きのメモだったらどうでしょう?

  • 「料理」の本は、ほんの数冊しかないと思っていた
  • 実は、そこには何万冊もの「料理」に関する本が隠されていた

あなたは「すぐ終わるだろう」と軽い気持ちで案内しますが、行ってみると膨大な量で、お客さんを待たせてしまう……。データベースもこれと同じなんです。

PostgreSQLは、普段はデータを効率よく探すために「統計情報」という名の「館内の見取り図」を使っています。でも、特定のカラム(例えば「カテゴリ」や「状態」など)のデータが極端に偏っていると、この見取り図が少しだけ的外れになってしまうことがあるんです。

魔法のコマンド:`SET STATISTICS`

そんな時、「ここだけはもっと詳しく調べておいて!」とPostgreSQLに指示を出せるのが、今回紹介する `ALTER TABLE … ALTER COLUMN … SET STATISTICS` というコマンドです。

やり方はとってもシンプル。例えば `items` というテーブルの `status` カラムが、データの偏りのせいで検索が遅くなっているなら、こう書いてあげます。

ALTER TABLE items ALTER COLUMN status SET STATISTICS 500;

数字の「500」は、やる気の度合いだと思ってください。デフォルトでは通常「75」程度なのですが、これを大きくすることで、PostgreSQLは「このカラムについては、もっとじっくり、細かくデータを分析するぞ!」と気合を入れ直してくれます。

使いすぎには要注意!

「じゃあ、全部の列を1000とかにしておけば安心じゃない?」と思ったあなた。鋭いですね!でも、それはちょっと待ってください。

  • コストがかかる: 詳細な分析には時間がかかります。全部を全力で分析させると、データベース全体の健康診断(統計情報の更新)がなかなか終わらなくなってしまいます。
  • 適材適所: あくまで「偏りが激しくて、クエリの動きがおかしくなるカラム」に絞って使うのが、腕の見せ所です。

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

データベースは、私たちが思っている以上に一生懸命に考えてくれています。ただ、たまに「勘違い」をしてしまうだけ。そんな時に、「ここは重要だよ」と優しくヒントを出してあげるのが、私たちエンジニアの役割なんです。

もし皆さんのシステムで「特定の条件の時だけ遅いな……」と感じるクエリがあったら、ぜひこの `SET STATISTICS` を思い出してみてください。

「見取り図」を少しだけ詳しく書き直すだけで、驚くほどスッキリとクエリが速くなるかもしれませんよ!

それでは、また次回の記事でお会いしましょう。ハッピーなチューニングライフを!

コメント

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