4.5.6 結合方式
- 〈この項の構成〉
(1) 結合方式の種類
結合方式の種類及び特徴(直積を除く)を次の表に示します。この表にある結合方式を適用できなかった場合は,直積が適用されます。
結合方式 |
処理方式 |
初回のデータ取り出し |
長所 |
短所 |
---|---|---|---|---|
結合列でソートして,結合列の値が小さいものから順に突き合わせ処理をします。 |
遅い |
ヒット件数の多い表同士でも,少ないメモリで結合できるので,ほかの方式に比べて性能劣化が少ないです。 また,結合列のデータがソート済みで,マージジョインのためのソート処理をキャンセルできる場合は,高速に検索できます。 |
結合する列のデータがソートされていない場合,ソート処理の負荷が高くなり,性能が悪くなります。 |
|
外表の結合列の値を使用して,内表の結合列に定義されているインデクスをサーチして,突き合わせを入れ子にしたものを繰り返して処理します。 |
速い |
内表を結合列に指定したインデクスで絞り込める場合,高速に検索できます。 |
外表から行を1件取り出すごとに,インデクスを使用して内表を検索するため,外表のヒット件数が多い場合は性能が悪くなります。 |
|
内表の結合列からハッシュ表を作成し,外表の結合列をハッシングして内表から作成したハッシュ表と突き合わせ処理をします。 |
内表のヒット件数が少ない場合は速い(ネストループジョインよりは遅く,マージジョインよりは速い) |
内表のヒット件数が少なく,外表のヒット件数が多い場合,高速に検索できます。 |
内表のヒット件数が多い場合は使用するメモリが多くなります。また,メモリを使用できなくなった分については,いったんファイルに退避するため,性能が悪くなります。 |
|
?パラメタを含んだ条件がある場合,あらかじめ結合方法の候補を複数作成しておいて,?パラメタの値を入力した時点で最適な検索方法を決定します。 |
実際に選択された検索方法によって異なる |
?パラメタの値を入力する時点で,最適な検索方法を選択できます。 |
最適化情報収集ユティリティ(pdgetcst)を実行しておく必要があります。※ また,複数の結合方法の候補を作成するため,SQLオブジェクトのサイズが大きくなります。 |
- 注※
-
最適化情報収集ユティリティを実行していても,最適なアクセスパスを選択できない場合があります。最適化情報収集ユティリティの実行要否については,マニュアル「HiRDB コマンドリファレンス」を参照し,性能について十分に検証するようにしてください。
(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‒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)以上の場合
ヒット率が大きく,外表をあまり絞り込めないので,実行時にマージジョインが選択されます。
-