【入門編】 ハッシュ結合 – PostgreSQL

こんにちは!データベースの世界へようこそ。

普段何気なく「SELECT FROM …」なんてクエリを書いていますが、その裏側でデータベース(PostgreSQL)がいったい何を考えているのか、気になったことはありませんか?

今日は、数ある結合(JOIN)のテクニックの中でも、特に「賢いやり方」として知られる「ハッシュ結合(Hash Join)」について、お話ししようと思います。難しい専門用語はなるべく置いておいて、日常の風景に例えてみましょう。

—

宿題の「答え合わせ」で考えてみよう

想像してみてください。あなたは今、クラス全員分(30人)のテスト用紙を採点したあと、手元にある「解答一覧表」を見ながら、一人ひとりの点数を確認する作業をしています。

このとき、あなたならどんなやり方をしますか?

1. 力技のやり方: テスト用紙を1枚手に取るたびに、解答一覧表の最初から最後までを端から端まで指でなぞって、一致する名前を探す。これを30回繰り返す。
2. 賢いやり方: あらかじめ解答一覧表を「名前の頭文字」ごとに箱に分けて整理しておき、テスト用紙を手に取ったら、その名前の箱だけをパッと見て答えを確認する。

実は、「ハッシュ結合」は、この「2. 賢いやり方」をデータベースがやっている状態なんです。

—

PostgreSQLがやっている「ハッシュテーブル」という整理術

データベースの世界では、結合する2つのテーブルのうち、片方を「ハッシュテーブル」という特別な整理棚に作り替えます。

これが、先ほどの例で言う「名前の頭文字ごとの箱」にあたります。

手順はとってもシンプル!

1. 下準備(構築フェーズ): 小さい方のテーブルをメモリ上に読み込み、パッと検索できるように「ハッシュテーブル」というインデックス付きの棚を作ります。
2. 照らし合わせ(プローブフェーズ): もう片方のテーブルを順番にスキャンしていきます。読み込んだデータが、さっき作った「ハッシュテーブル」のどこに当てはまるか、一瞬で探しに行きます。

もし、いちいち全部のデータを見に行っていたら(さっきの「力技」ですね)、データが増えれば増えるほど時間はかかってしまいますよね。でも、ハッシュ結合なら、この「整理棚」のおかげで、データ量が多くても効率よく相手を見つけることができるんです。

—

なぜこれが「最強」と言われるのか

PostgreSQLのエンジニアたちがこの手法を好む理由は、「一度整理してしまえば、あとは速い」という一点に尽きます。

もちろん、デメリットもあります。もし、メモリ上に作りたい「整理棚(ハッシュテーブル)」が大きすぎて、メモリに入りきらなくなったらどうなるでしょうか?

そう、デスクから溢れた書類を一旦床に置くように、ハードディスク(一時領域)にデータを書き出さなければならず、急にスピードが落ちてしまうんです。だからこそ、データベースは賢く「このデータ量ならハッシュ結合が速いかな? それとも別の方法がいいかな?」と、常に計算しているんですね。

—

まとめ:データベースも「段取り」が8割

結局のところ、ハッシュ結合とは「あらかじめ相手を見つけやすく整理しておく」という、段取り上手なテクニックのことです。

普段皆さんが実行しているSQLが、裏側でこんなふうに「どうやったら一番楽に答えが見つかるか」を一生懸命考えていると思うと、なんだか愛着が湧いてきませんか?

「ハッシュ結合」という言葉を聞いたら、ぜひ「ああ、今あの子は一生懸命、頭の中で整理棚を作っているんだな」と想像してみてくださいね。

それでは、また次回の記事でお会いしましょう!データベースの世界は、知れば知るほど面白いですよ。

コメント

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