【入門編】 一意な値の数(n_distinct) – PostgreSQL

「この箱に何種類入ってる?」PostgreSQLがクエリを速くするための頭脳戦

こんにちは!データベースの世界へようこそ。
普段、何気なく「SELECT FROM …」なんてクエリを書いていますが、データベースの中では毎回、ものすごい速さで「どうやってデータを探しに行こうかな?」という作戦会議が行われているのを知っていますか?

今日はその作戦会議でとっても重要な役割を果たす、「n_distinct(エヌ・ディスティンクト)」という考え方について、お話ししようと思います。

専門用語っぽくて難しそう? 大丈夫です。一緒に身近な例で考えてみましょう!

—

想像してみてください:お菓子箱の仕分け作業

あなたは今、大量のお菓子が入った巨大な箱から、特定のお菓子を仕分けする係になったとします。

ここで、箱の中身について「どれくらい種類があるか」を知っているかどうかで、作業の効率が劇的に変わりますよね。

  • パターンA:種類がめちゃくちゃ多い(ほぼ全部バラバラ)

「全部違うお菓子だから、一つずつ丁寧に見ていこう!」という戦略が正解ですよね。

  • パターンB:種類は少ないけど、同じのが大量に入ってる

「あ、これはチョコだ!これもチョコ!こっちもチョコ!」とまとめて片付けちゃったほうが、断然速いと思いませんか?

データベースの世界でもこれと全く同じことが起きています。PostgreSQLが「この列には何種類くらいのデータが入っているかな?」と推測する数、それがn_distinctです。

—

なぜこの「推測」が大事なの?

もしPostgreSQLが「この列には100万種類のデータがあるはずだ!」と信じているのに、実際には「たった2種類」しかなかったらどうなるでしょう?

データベースは、「100万種類あるなら、一つずつ検索したほうが速いな!」と判断して、わざわざ遠回りな方法を選んでしまいます。結果、本来なら一瞬で終わるはずの処理が、無駄に時間がかかってしまうことに……。

これを専門用語で「実行計画の誤算」と呼んだりしますが、要は「勘違いのせいで、とんでもなく効率の悪いルートを通らされている状態」なんです。

—

n_distinct と仲良くなるために

「じゃあ、その数を正確に覚えさせればいいの?」と思うかもしれませんが、実はそこが難しいところ。データは日々増えたり減ったりしますよね。

そこでPostgreSQLは、定期的に「統計情報(アナライズ)」という健康診断を行っています。

  • `ANALYZE`コマンド: これを実行すると、PostgreSQLが「ちょっと箱の中身をサンプリングして、だいたい何種類くらいあるか見てみるか!」と調査をしてくれます。

もし、「最近クエリがなんだか遅いな?」と感じたら、この統計情報が古くなっていて、PostgreSQLが「今のデータ量や種類」を誤解している可能性があります。そんなときは、ぜひ一度 `ANALYZE` を試してみてください。

—

最後に:データベースは「賢いけど、おっちょこちょい」

データベースは超高性能なコンピューターですが、人間と同じで「与えられた情報」をもとに判断しています。

「n_distinct」という言葉、最初は難しく聞こえたかもしれませんが、要は「データベースに、データの個性(多様性)をちゃんと教えてあげよう」という仕組みのことなんです。

  • データが偏っていないか?
  • 種類は多そうか、少なそうか?

こうやってデータの「中身」に少し興味を持ってあげるだけで、あなたの書くクエリは驚くほど速く、軽やかに動くようになりますよ。

皆さんも、たまにはデータベースが「どんな作戦会議をしているのかな?」と想像して、`EXPLAIN`コマンドなんかで覗いてみてくださいね。きっと、もっと仲良くなれるはずです!

それでは、また次回のブログでお会いしましょう。ハッピー・クエリライフ!

コメント

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