スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド

[目次][索引][前へ][次へ]

4.5.6 結合方式

<この項の構成>
(1) 結合方式の種類
(2) 処理方式

(1) 結合方式の種類

結合方式の種類及び特徴(直積を除く)を次の表に示します。この表にある結合方式を適用できなかった場合は,直積が適用されます。

表4-10 結合方式の種類及び特徴

結合方式 処理方式 初回のデータ取り出し 長所 短所
マージジョイン 結合列でソートして,結合列の値が小さいものから順に突き合わせ処理をします。 遅い ヒット件数の多い表同士でも,少ないメモリで結合できるので,ほかの方式に比べて性能劣化が少ないです。
また,結合列のデータがソート済みで,マージジョインのためのソート処理をキャンセルできる場合は,高速に検索できます。
結合する列のデータがソートされていない場合,ソート処理の負荷が高くなり,性能が悪くなります。
ネストループジョイン 外表の結合列の値を使用して,内表の結合列に定義されているインデクスをサーチして,突き合わせを入れ子にしたものを繰り返して処理します。 速い 内表を結合列に指定したインデクスで絞り込める場合,高速に検索できます。 外表から行を1件取り出すごとに,インデクスを使用して内表を検索するため,外表のヒット件数が多い場合は性能が悪くなります。
ハッシュジョイン 内表の結合列からハッシュ表を作成し,外表の結合列をハッシングして内表から作成したハッシュ表と突き合わせ処理をします。 内表のヒット件数が少ない場合は速い(ネストループジョインよりは遅く,マージジョインよりは速い) 内表のヒット件数が少なく,外表のヒット件数が多い場合,高速に検索できます。 内表のヒット件数が多い場合は使用するメモリが多くなります。また,メモリを使用できなくなった分については,いったんファイルに退避するため,性能が悪くなります。
SELECT-APSL ?パラメタを含んだ条件がある場合,あらかじめ結合方法の候補を複数作成しておいて,?パラメタの値を入力した時点で最適な検索方法を決定します。 実際に選択された検索方法によって異なる ?パラメタの値を入力する時点で,最適な検索方法を選択できます。 最適化情報収集ユティリティ(pdgetcst)を実行しておく必要があります。
また,複数の結合方法の候補を作成するため,SQLオブジェクトのサイズが大きくなります。
分散ネストループジョイン 外表の結合列の値を使用して,内表である外部表の突き合わせをする方式です(HiRDB External Data Accessが組み込まれている場合に適用されます)。 速い 外表のヒット件数が少なく,内表のヒット件数が多い場合に,高速に検索できます。 外表から行を取り出すごとに,外部表のある外部サーバを検索するため,外表のヒット件数が多い場合は性能が悪くなります。

注※
最適化情報収集ユティリティを実行していても,最適なアクセスパスを選択できない場合があります。最適化情報収集ユティリティの実行要否については,マニュアル「HiRDB Version 8 コマンドリファレンス」を参照し,性能について十分に検証するようにしてください。

(2) 処理方式

(a) マージジョイン

マージジョインは,外表をあまり絞り込めないときに有効です。

SORT MERGE JOIN
外表と内表から行を取り出して,それぞれ作業表を作成しソートします。その後,結合条件を満たした行同士を結合します。
SORT MERGE JOINの処理方式を次の図に示します。

図4-25 SORT MERGE JOINの処理方式

[図データ]

KEY SCAN MERGE JOIN
外表と内表から,KEY SCANで行を取り出します。その後,結合条件を満たした行同士を結合します。
KEY SCAN MERGE JOINの処理方式を次の図に示します。

図4-26 KEY SCAN MERGE JOINの処理方式

[図データ]

LIST SCAN MERGE JOIN
外表と内表から作業表を作成し,ソートをしないで結合列の昇順に行を取り出します。その後,結合条件を満たした行同士を結合します。
LIST SCAN MERGE JOINの処理方式を次の図に示します。

図4-27 LIST SCAN MERGE JOINの処理方式

[図データ]

L-KEY R-LIST MERGE JOIN
外表はKEY SCANで行を取り出し,内表は作業表を作成し,ソートをしないで行を取り出します。その後,結合条件を満たした行同士を結合します。

L-KEY R-SORT MERGE JOIN
外表はKEY SCANで行を取り出し,内表は作業表を作成し,ソートをして行を取り出します。その後,結合条件を満たした行同士を結合します。

L-LIST R-KEY MERGE JOIN
外表は作業表を作成し,ソートをしないで行を取り出し,内表はKEY SCANで行を取り出します。その後,結合条件を満たした行同士を結合します。

L-LIST R-SORT MERGE JOIN
外表は作業表を作成し,ソートをしないで行を取り出します。また,内表は作業表を作成し,ソートをして行を取り出します。その後,結合条件を満たした行同士を結合します。

L-SORT R-KEY MERGE JOIN
外表は作業表を作成し,ソートをして行を取り出し,内表はKEY SCANで行を取り出します。その後,結合条件を満たした行同士を結合します。

L-SORT R-LIST MERGE JOIN
外表は作業表を作成し,ソートをして行を取り出し,内表は作業表を作成し,ソートをしないで行を取り出します。その後,結合条件を満たした行同士を結合します。
(b) ネストループジョイン

ネストループジョインは,内表にインデクスが定義されていて,外表をかなり絞り込めるときに有効です。

NESTED LOOPS JOIN
外表から1行ずつ行を取り出し,内表のそれぞれの行に突き合わせて,結合条件を満たす行を取り出す入れ子型のループ処理をする結合方法です。
NESTED LOOPS JOINの処理方式を次の図に示します。

図4-28 NESTED LOOPS JOINの処理方式

[図データ]

R-LIST NESTED LOOPS JOIN
内表から行を取り出して作業表を作成します。その後,外表から1行ずつ行を取り出して,それぞれの行に対して内表から作成した作業表を突き合わせ,結合条件を満たす行を取り出す入れ子型のループ処理をする結合方法です。
R-LIST NESTED LOOPS JOINの処理方式を次の図に示します。

図4-29 R-LIST NESTED LOOPS JOINの処理方式

[図データ]
(c) ハッシュジョイン

HASH JOIN
あらかじめ内表の結合列の値でハッシングしてハッシュ表を作成しておいて,外表を1行取り出すごとに外表の結合列の値でハッシングして,内表から作成しておいたハッシュ表と突き合わせて結合します。
HASH JOINの処理方式を次の図に示します。

図4-30 HASH JOINの処理方式

[図データ]

ハッシュジョインには,4種類の処理方式があります。ハッシュジョインの処理方式と特徴を次の表に示します。

表4-11 ハッシュジョインの処理方式と特徴

処理方式 内容 長所 短所 選択方法
一括ハッシュジョイン 内表から作成したハッシュ表を,すべて作業表用バッファ領域に展開し,ハッシュジョインをする方式です。
メモリ使用量はやや多くなり,処理性能もやや良くなります。
ハッシュ表を,すべて作業表用バッファ領域に展開してハッシュジョインをするため,高速に処理できます。 内表のハッシュ表サイズが大きい場合,使用する作業表用バッファ領域が大きくなるのでSQL文の同時実行性が損なわれます。 ハッシュ表サイズを変更します。
バケット分割ハッシュジョイン 内表,外表を複数のバケットに分割し,内表の一部のバケットからハッシュ表を作成して作業表用バッファ領域に展開します。さらに,残りのバケットを作業表用ファイルに退避しておいて,作業表用バッファ領域に展開された内表のバケットと,同じ値の領域の外表バケットを読み出して,ハッシュジョインします。そして,作業表用ファイルから,内表を少しずつ作業表用バッファ領域に展開してハッシュジョインをする方式です。
メモリ使用量は少なくなり,処理性能はやや悪くなります。
作業表用バッファ領域が少ない環境でも,ハッシュジョインができます。 内表,外表の行をいったん作業表用ファイルに退避するため,作業表用バッファ領域だけでハッシュジョインする場合に比べると,性能が悪くなります。
連続ハッシュジョイン 3表以上を検索する場合に,最も外側の表以外の表から,ハッシュ表を作成して作業表用バッファ領域に展開しておいて,連続してハッシュジョインをする方式です。
メモリ使用量は多くなり,処理性能は良くなります。
ハッシュ表をすべて作業表用バッファ領域に展開してハッシュジョインをするので,高速に処理できます。
また,最も外側の表だけが大きい場合,高速に処理できます。
連続実行する表の数が多くなると,使用する作業表用バッファ領域が大きくなります。 選択できません。
表の行数を基に,HiRDBが自動的に最適な方式を選択します。
断続ハッシュジョイン 3表以上を検索する場合,表又は作業表を結合するごとに,結合結果を作業表用ファイルに退避してハッシュジョインをする方式です。
メモリ使用量は少なくなり,処理性能は悪くなります。
作業表用バッファ領域が少ない環境でも,3表以上のハッシュジョインができます。 表又は作業表を結合するごとに,結合結果をいったんファイルに退避するため,入出力が多くなり性能が悪くなります。

注※
ハッシュ表サイズの変更については,「4.5.10 ハッシュジョイン,副問合せのハッシュ実行を適用する場合の準備」を参照してください。

 

各処理方式の概要を次に示します。

●一括ハッシュジョイン
内表から作成したハッシュ表を,すべて作業表バッファ領域に展開してハッシュジョインします。
一括ハッシュジョインの処理方式を次の図に示します。

図4-31 一括ハッシュジョインの処理方式

[図データ]

●バケット分割ハッシュジョイン
内表,外表をバケットに分割し,内表の一部を作業表用バッファ領域に展開し,残りを作業表用ファイルに退避します。
バケットとは,表の結合列の値でハッシングして,複数の小さな表に分割することをいいます。
結合処理は,作業表用バッファ領域に展開された内表の一部で行います。まず,内表からハッシュ表を作成し,外表から1行ずつ取り出して内表から作成したハッシュ表と突き合わせて結合をします。作業表バッファ領域にある表同士の結合が終わった時点で,作業表用ファイルから外表,内表のバケットを作業表用バッファ領域に展開し,同様に結合処理をします。そして,表全体を作業表用バッファ領域に展開して結合した時点で終了となります。
バケット分割ハッシュジョインの処理方式を次の図に示します。

図4-32 バケット分割ハッシュジョインの処理方式

[図データ]

●連続ハッシュジョイン
3表以上の検索に適用します。
まず,最も外側の表以外の表からハッシュ表を作成し,作業表用バッファ領域に展開します。次に,外表から1行取り出してハッシングして,内表から作成したハッシュ表と突き合わせて結合します。結合条件を満たす場合には,結合結果でハッシングしてハッシュ表と突き合わせて結合します。
最後の行まで結合し終わるか,又は条件が偽になった時点で,最も外側の表まで戻り,次の行を取り出して同様に結合処理を繰り返します。結合途中で内表の結合キー値が重複している箇所がある場合には,そこまで戻って結合処理を繰り返します。重複キー値の処理がすべて終了したら,最も外側の表まで戻り,次の行を取り出して同様に結合処理を繰り返します。
連続ハッシュジョインの処理方式を次の図に示します。

図4-33 連続ハッシュジョインの処理方式

[図データ]

●断続ハッシュジョイン
3表以上の検索に適用します。
まず,最初の結合の内表からハッシュ表を作成し,作業表用バッファ領域に展開します。次に,外表を1行ずつ取り出して外表の結合列の値でハッシングし,内表から作成したハッシュ表と突き合わせて結合します。外表からすべての行を取り出して結合し終わったら,次の結合処理に移ります。
結合結果が外表になる場合と,内表になる場合とで処理が変わります。
結合処理が外表になる場合は,次の結合の内表からハッシュ表を作成し,結合結果から1行ずつ取り出して,内表から作成したハッシュ表と突き合わせて結合します。
処理結果が内表になる場合は,結合結果からハッシュ表を作成し,外表から1行ずつ取り出して,結合結果から作成したハッシュ表と突き合わせて結合します。
断続ハッシュジョインの処理方式を次の図に示します。なお,この処理方式では,外表1→((外表2→内表1)→内表2)と結合した場合を例にしています。

図4-34 断続ハッシュジョインの処理方式

[図データ]
(d) SELECT-APSL

SELECT-APSLは,SQL実行時に結合方法を動的に決定する方式です。

SELECT-APSL(HiRDB/パラレルサーバ限定)
条件に?パラメタを含んでいる場合,?パラメタの値によって最適な結合方法が変わることがあります。また,SQL最適化処理時に?パラメタの値が決まらないため,最適な結合方法が決定できません。そのため,SQL実行時にヒット率を計算して結合方法を決定します。
SELECT-APSLについて,アクセスパス表示ユティリティ(pdvwopt)の表示例を使用して説明します。
 
条件   T1(外表).C1=?パラメタ
基準値  0.047
 [1] ネストループジョイン
 [2] マージジョイン
 
[説明]
  • 述語T1(外表).C1=?パラメタのヒット率が,基準値(0.047)より小さい場合
    ヒット率が小さく,外表をかなり絞り込めるので,実行時にネストループジョインが選択されます。
  • 述語T1(外表).C1=?パラメタのヒット率が,基準値(0.047)以上の場合
    ヒット率が大きく,外表をあまり絞り込めないので,実行時にマージジョインが選択されます。
(e) 分散ネストループジョイン

DISTRIBUTED NESTED LOOPS JOIN (DNL JOIN)
自HiRDBで外表から行を取り出し,それぞれの行に対して,内表(外部表)のある外部サーバに外表の行の値を変数で渡したSQL文を実行して突き合わせることで,結合条件を満たす行を取り出す入れ子型のループ処理をする結合方法です。自HiRDBから,外部サーバに対して外部表の取得要求をすると,外部のDB(DBMS)から検索結果を取得できます。
DISTRIBUTED NESTED LOOPS JOINの処理方式を次の図に示します。

図4-35 DISTRIBUTED NESTED LOOPS JOINの処理方式

[図データ]
(f) 直積

CROSS JOIN
外表のすべての行と,内表のすべての行をそれぞれ組み合わせて結合します。2表にわたった条件があれば,結合した後に判定します。
CROSS JOINの処理方式を次の図に示します。

図4-36 CROSS JOINの処理方式

[図データ]