Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【DB】分散DBシステムのテーブル結合

分散RDBMSシステムでのテーブル結合

分散DBシステムでは、物理的には複数のDBにデータを分散させているにもかかわらず、あたかも一つのDBにアクセスしているかのように振る舞います(位置透過性)。例えばSQLで複数のテーブルを結合しつつ問い合わせを行う時、各テーブルが物理的に離れた場所のDBにあっても、各DBが互いに連携することで整合性の取れた結果を取得することができます。

遠隔地にあるDB同士が互いの持つデータをやり取りする場合、出来る限り通信負荷を削減したいものです。分散RDBMSシステムでテーブル結合を行う場合には、通信負荷軽減のため以下のような結合法を採用します。

  • セミジョイン法
  • 入れ子ループ法
  • マージジョイン法

セミジョイン法

例として、以下の二つのテーブルを結合するとします。

商品テーブル
商品ID 商品名 価格
1 チョコレート 200
2 キャラメル 50
3 キャンディ 100
伝票テーブル
伝票ID 顧客ID 商品ID 個数
1 001 1 10
2 001 2 20
3 002 1 30

SQLは以下のとおりです。

SELECT 商品.商品ID, 伝票.伝票ID
FROM  商品, 伝票
WHERE 商品.商品ID = 伝票.伝票ID

このとき、セミジョイン法ではDBが検索対象となった列の値のみを他方のDBに送信し、値を受け取ったDBはマッチする結果行を元のDBへ返戻します。

f:id:rennnosukesann:20180408233805p:plain

上のSQLの結合に必要な列は商品IDだけなので、大阪DBは商品IDのみからなる部分テーブルを名古屋DBに送り、名古屋DBは送られた部分テーブルと伝票テーブルを結合します。結合結果から必要となる列のみからなるテーブルを射影し、大阪DBに送り直しています。このように特定列の値のみを送受信することで、通信量を削減しています。

入れ子ループ法

入れ子ループ法では、DBがテーブル行を一行ずつ送信しながら、他方のDBによる結合結果を受け取る方式です。

f:id:rennnosukesann:20180408233819p:plain

送信元では必要な列の射影を行わず、とにかく一行ずつ送信して、相手に結合結果を返してもらいます。

マージジョイン法

マージジョイン法は、他方のDBにソート済みのテーブルデータを送信してもらった上で結合を行います。

f:id:rennnosukesann:20180408234412p:plain

結合回数は少なくなりますが、データ送信量は先に紹介した手法と比較して大きいです。