こんにちは!データベースの世界へようこそ。
PostgreSQLを触っていると、「結合(JOIN)」という言葉によく出会いますよね。二つのテーブルをガッチャンコして、新しいデータを作る作業です。
今日はその中でも、特に頭のいいやり方である「ハッシュ結合(Hash Join)」についてお話しします。難しそうな名前ですが、実は私たちの日常の中にある「ある作業」にそっくりなんですよ。
—
「名簿」と「テストの点数」を合わせる時、どうする?
例えば、手元に「クラス全員の名前が書かれた名簿」と、「バラバラの順番で並んでいるテストの点数表」があるとします。この二つを突き合わせて、誰が何点を取ったかを確認したいとき、あなたならどうしますか?
一番原始的なのは、名簿の1人目を見て、点数表の最初から最後までを全部探す…これを全員分繰り返す方法です。でも、これだと時間がかかりすぎて、日が暮れちゃいますよね。
そこで、賢い人はこう考えます。
1. 小さい方のテーブルを、頭の中で「整理」して覚える(ハッシュテーブルの作成)
2. もう一方のテーブルをペラペラめくりながら、さっき覚えた情報と照らし合わせる(プローブ)
これが、PostgreSQLが誇る「ハッシュ結合」の仕組みです。
—
ハッシュ結合の「魔法」:3つのステップ
PostgreSQLが裏側でやっていることを、もう少し具体的に見ていきましょう。
1. メモリの上に「カンニングペーパー」を作る
まず、結合する二つのテーブルのうち、データ量が少なそうな方をメモリ上に展開します。このとき、ただ並べるのではなく、「どこに何があるか」を瞬時に見つけられるように、特殊な計算(ハッシュ関数)をしてインデックスを付けた箱を作ります。これが「ハッシュテーブル」です。
2. もう片方のテーブルをさらっと確認する
次に、残りの大きなテーブルを上から順番にスキャンしていきます。
3. 一瞬で答え合わせ!
大きなテーブルから一行読むたびに、先ほど作った「カンニングペーパー」をチラッと見ます。「このIDの人は、さっき作った箱のこの場所だね!」と、迷うことなくパッと答え合わせができるんです。
わざわざ全部を探し回る必要がないので、「あ、この人ならさっきのリストのここ!」と直感的に繋げられるのが、ハッシュ結合のすごいところですね。
—
注意点:メモリという「机の広さ」
ここまで聞くと「じゃあ全部ハッシュ結合でいいじゃん!」と思うかもしれません。でも、一つだけ弱点があるんです。
それは、「メモリ(作業机)の広さには限界がある」ということ。
もし結合したいデータがとてつもなく大きくて、メモリという机の上に乗り切らなくなると、PostgreSQLは必死になって机の上の書類を一時的に床(ディスク)に退避させます。この「床に広げる作業」が発生すると、途端に処理が遅くなってしまいます。
「机(メモリ)に収まるサイズのデータなら爆速だけど、溢れるとちょっと大変」
これが、ハッシュ結合の性格なんです。
—
最後に:なぜ知っておくといいの?
「そんな裏側の仕組み、知らなくてもSQLは動くよ!」と思われるかもしれません。確かにその通りです。
でも、データベースが「なぜこのやり方を選んだのかな?」と想像できるようになると、パフォーマンスが出ないときに「あ、もしかしてメモリが足りなくて苦しんでるのかな?」といった具合に、問題の根っこに気づけるようになります。
PostgreSQLは、今日もあなたのクエリを少しでも速くしようと、メモリという机の上で一生懸命計算してくれています。そんな愛着を持って付き合ってあげると、きっとデータベースとの距離もぐっと縮まりますよ。
また気になることがあったら、いつでも聞きに来てくださいね!それでは、良いデータベースライフを!
コメント