【入門編】 分散結合戦略 – Cloud Spanner

こんにちは!Cloud Spannerの世界へようこそ。
チーフアーキテクトの私です。

「世界中の膨大なデータを、止まることなく、一瞬で処理するデータベース」と聞くと、なんだか難しそうだな……と感じるかもしれませんね。でも大丈夫。今日は、Cloud Spannerの心臓部の一つである「分散結合(JOIN)戦略」について、難しい数式や専門用語をできるだけ使わず、日常の出来事に例えて優しく紐解いていきます。

ここをクリアすれば、Cloud Spannerのデータが裏側でどうやって組み合わされているのか、その基本はバッチリマスターできますよ。一緒に楽しく学んでいきましょう!

—

1. スプリットの正体:ダンボール箱の山

まず、Cloud Spannerがどうやってデータを保存しているかを知る必要があります。

Cloud Spannerは、数千台、数万台というコンピューターの力を束ねて動く「超巨大なデータベース」です。もし、すべてのデータを1カ所に集めていたら、世界中からのアクセスでパンクしてしまいますよね。だから、Spannerはデータを細かく切り分けて、たくさんのコンピューター(ノード)に分散させています。

この、切り分けられたデータのひと塊を、私たちは「スプリット」と呼んでいます。

日常の例えで考えてみましょう。
あなたは「超巨大な本屋さん」の店長さんです。お客さんが多すぎて、すべての本を1つの棚に置くことはできません。そこで、五十音順やジャンルごとに、たくさんのダンボール箱に本を分けて、大きなお店のあちこちに配置しました。この「ダンボール箱」が、Spannerでいう「スプリット」です。

—

2. 「結合(JOIN)」ってなに?

データベースでよく使う「JOIN(結合)」とは、別々の場所にある関連するデータをドッキングさせる作業のことです。

例えば、

  • 「お客様のリスト」が入ったダンボール箱
  • 「注文履歴」が入ったダンボール箱

この2つを組み合わせて、「田中さんが何を買ったのか」を知りたいときに行うのがJOINです。

もし、お客様リストがお店の「東の端」にあり、注文履歴が「西の端」にあったらどうでしょう? あなたは何度も往復して、メモを見比べなければなりませんよね。コンピューターの世界でも同じで、遠く離れたスプリットの間でデータを合わせるには、ネットワークを行ったり来たりする時間(コスト)がかかるのです。

この「遠く離れたダンボール箱のデータ同士を、どうやったら一番効率よく組み合わせられるか?」を考えて実行するのが、Spannerの分散結合戦略です。

—

3. スパイスが効いた2つの代表的な作戦

Cloud Spannerの頭脳(オプティマイザー)は、データを組み合わせるときに、状況に応じていくつかの「作戦」を使い分けます。代表的な2つの作戦を覗いてみましょう。

作戦その1:ハッシュ・ジョイン(Hash Join) —— 「色別に仕分ける作戦」

【日常の例え】
文化祭で、全校生徒(1,000人)の名簿と、クラスごとの出し物リストを照らし合わせるとします。全校生徒がランダムにバラバラの場所に座っています。
一番手っ取り早いのは、一度みんなを「血液型ごと(あるいは出席番号の末尾ごと)」のグループにパパッと集めて、同じグループ同士で突き合わせることですよね。

【Spannerの動き】
Hash Joinは、結合したい目印(例えば「お客様ID」など)をもとに、データをいったんハッシュ関数という「仕分けルール」でパッとグループ分けします。そして、同じグループに入ったデータ同士を同じ場所(コンピューター)に集めてドッキングさせます。

  • 得意なこと: データの並び順がバラバラでも、大量のデータを一気に処理する力技が得意。

作戦その2:マージ・ジョイン(Merge Join) —— 「あらかじめ並べておく作戦」

【日常の例え】
すでに「出席番号順」に綺麗に並べられた名簿が2冊あります。
この2冊を重ねて、上から順番に「あ、1番は一緒だね」「2番も一緒だね」と、ペラペラとめくりながら照合していく方法です。これなら無駄な動きが一切ありません。

【Spannerの動き】
Merge Joinは、結合する目印の順にあらかじめ綺麗にデータを並べ替えておき(あるいは最初から並んでいる状態を利用し)、まるでチャックを合わせるかのように、スルスルと効率よく結合していく作戦です。

  • 得意なこと: データがすでに綺麗に並んでいるとき、ネットワークの通信量を最小限にして超高速に処理できる。

—

4. 実際のSQLと心構え

Cloud Spannerでは、私たちが普段書く標準的なSQL(データベース言語)を受け取ると、Spannerの頭脳が「今回はどのダンボール箱とどのダンボール箱が遠くにあるから、ハッシュ・ジョインを使おうかな、それともマージ・ジョインにしようかな」と、一瞬で最善の作戦を考えて実行してくれます。

例えば、次のようなSQLを書いたとします。

— お客様情報(Customers)と注文履歴(Orders)を結合する例
SELECT
c.customer_name,
o.order_date,
o.total_amount
FROM
Customers c
JOIN
Orders o ON c.customer_id = o.customer_id
WHERE
o.order_date >= ‘2023-10-01’;

(※このSQLを実行すると、Spannerは裏側でスプリットの配置を計算し、最も効率の良い分散結合戦略を自動的に選択してデータをかき集めてくれます)

私たちエンジニアが意識すべきなのは、「データベースが効率よくデータを並べ替えられるようなヒント(インデックス)をあらかじめ用意してあげること」です。それさえしておけば、複雑な分散の仕組みはSpannerがすべて完璧に裏でやってくれます。

—

おわりに

いかがでしたでしょうか?
「分散結合戦略」と聞くと身構えてしまいますが、要するに「あちこちに散らばったダンボール箱(スプリット)の中身を、いかにムダなく効率よく突き合わせるか」という、お店の効率化の工夫そのものです。

この基本イメージさえ持っていれば、Cloud Spannerが裏側でどれほど高度なことをやっているとしても、怖がる必要はもうありません。

さあ、基本はバッチリマスターできましたね!
次のステップでも、この調子で楽しくCloud Spannerの深淵を覗いていきましょう。あなたのエンジニアライフを、チーフアーキテクトとしていつも応援しています!

コメント

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