「この箱に何種類入ってる?」PostgreSQLがクエリを速くするための頭脳戦
こんにちは!データベースの世界へようこそ。
普段、何気なく「SELECT FROM …」なんてクエリを書いていますが、データベースの中では毎回、ものすごい速さで「どうやってデータを探しに行こうかな?」という作戦会議が行われているのを知っていますか?
今日はその作戦会議でとっても重要な役割を果たす、「n_distinct(エヌ・ディスティンクト)」という考え方について、お話ししようと思います。
専門用語っぽくて難しそう? 大丈夫です。一緒に身近な例で考えてみましょう!
—
想像してみてください:お菓子箱の仕分け作業
あなたは今、大量のお菓子が入った巨大な箱から、特定のお菓子を仕分けする係になったとします。
ここで、箱の中身について「どれくらい種類があるか」を知っているかどうかで、作業の効率が劇的に変わりますよね。
- パターンA:種類がめちゃくちゃ多い(ほぼ全部バラバラ)
「全部違うお菓子だから、一つずつ丁寧に見ていこう!」という戦略が正解ですよね。
- パターンB:種類は少ないけど、同じのが大量に入ってる
「あ、これはチョコだ!これもチョコ!こっちもチョコ!」とまとめて片付けちゃったほうが、断然速いと思いませんか?
データベースの世界でもこれと全く同じことが起きています。PostgreSQLが「この列には何種類くらいのデータが入っているかな?」と推測する数、それがn_distinctです。
—
なぜこの「推測」が大事なの?
もしPostgreSQLが「この列には100万種類のデータがあるはずだ!」と信じているのに、実際には「たった2種類」しかなかったらどうなるでしょう?
データベースは、「100万種類あるなら、一つずつ検索したほうが速いな!」と判断して、わざわざ遠回りな方法を選んでしまいます。結果、本来なら一瞬で終わるはずの処理が、無駄に時間がかかってしまうことに……。
これを専門用語で「実行計画の誤算」と呼んだりしますが、要は「勘違いのせいで、とんでもなく効率の悪いルートを通らされている状態」なんです。
—
n_distinct と仲良くなるために
「じゃあ、その数を正確に覚えさせればいいの?」と思うかもしれませんが、実はそこが難しいところ。データは日々増えたり減ったりしますよね。
そこでPostgreSQLは、定期的に「統計情報(アナライズ)」という健康診断を行っています。
- `ANALYZE`コマンド: これを実行すると、PostgreSQLが「ちょっと箱の中身をサンプリングして、だいたい何種類くらいあるか見てみるか!」と調査をしてくれます。
もし、「最近クエリがなんだか遅いな?」と感じたら、この統計情報が古くなっていて、PostgreSQLが「今のデータ量や種類」を誤解している可能性があります。そんなときは、ぜひ一度 `ANALYZE` を試してみてください。
—
最後に:データベースは「賢いけど、おっちょこちょい」
データベースは超高性能なコンピューターですが、人間と同じで「与えられた情報」をもとに判断しています。
「n_distinct」という言葉、最初は難しく聞こえたかもしれませんが、要は「データベースに、データの個性(多様性)をちゃんと教えてあげよう」という仕組みのことなんです。
- データが偏っていないか?
- 種類は多そうか、少なそうか?
こうやってデータの「中身」に少し興味を持ってあげるだけで、あなたの書くクエリは驚くほど速く、軽やかに動くようになりますよ。
皆さんも、たまにはデータベースが「どんな作戦会議をしているのかな?」と想像して、`EXPLAIN`コマンドなんかで覗いてみてくださいね。きっと、もっと仲良くなれるはずです!
それでは、また次回のブログでお会いしましょう。ハッピー・クエリライフ!
コメント