Hitachi

Hitachi Advanced Data Binder AP開発ガイド


5.5.2 ハッシュジョインとは

外表の結合列を基に作成したハッシュテーブルと,内表の結合列をハッシングした結果を突き合わせて表を結合します。この結合方式をハッシュジョインといいます。

外表と内表を結合するための結合条件に指定した列に,インデクスが定義されている場合でも,結合条件の評価時にインデクスは使用されません(ハッシュを使用して結合条件を評価します)。ただし,結合条件に指定した内表の列にレンジインデクスが定義されていて,かつレンジインデクスが使用される条件を満たしている場合は,そのレンジインデクスが使用されることがあります。

なお,コスト情報を取得している場合,ハッシュジョインをチャンク単位に分割実行することがあります。この分割実行では,マルチチャンク表に対してチャンクごとに外表のデータを分割し,分割したデータごとにハッシュジョインを繰り返し実行します。

〈この項の構成〉

(1) ハッシュジョインによる結合方式

次のSELECT文を実行した際にハッシュジョインが適用された場合を例にして,ハッシュジョインによる結合方式を説明します。

(例)
SELECT * FROM "T1","T2" WHERE "T1"."C2">10 AND "T1"."C1"="T2"."C1"

結合対象の表のうち,どちらを外表,内表にするかは,HADBが決定します。この例では,表T1を外表,表T2を内表として説明します。また,下線部分の結合条件に指定しているT1.C1列とT2.C1列が結合列となります。

図5‒7 ハッシュジョインによる結合方式

[図データ]

[説明]
  1. 外表(表T1)の結合列の値を基に,ハッシュテーブルとハッシュフィルタを作成します。

  2. 内表(表T2)の結合列の値をハッシングした結果と,ハッシュテーブルを突き合わせて,表の結合を行います。内表の結合列をハッシュテーブルと突き合わせる前に,ハッシュフィルタを使用して事前にフィルタリングします。これによって,内表の結合列とハッシュテーブルの突き合わせ回数を削減できます。

T1を外表,表T2を内表とするハッシュジョインの場合,結合条件に指定した列("T1"."C1"および"T2"."C1")にインデクスが定義されている場合でも,結合条件("T1"."C1"="T2"."C1")の評価時にインデクスは使用されません。

"T1"."C2"にインデクスが定義されている場合は,「"T1"."C2">10」の評価時にインデクスが使用されることがあります。

また,次の2つの条件を満たす場合,ハッシュジョインの処理の際にレンジインデクスが使用されることがあります。

上記の2つの条件を満たす場合,ハッシュジョインの処理で,外表の結合列からハッシュテーブルを作成するときに,外表の結合列の最大値と最小値を求めます。そして,内表を検索するときにレンジインデクスを使用して,先に求めた結合列の最大値と最小値の範囲外となる内表のチャンクまたはセグメントをスキップします。

ハッシュテーブルは,ハッシュテーブル領域に作成されます。ハッシュテーブル領域サイズは,サーバ定義またはクライアント定義のadb_sql_exe_hashtbl_area_sizeオペランドで指定します。

ハッシュフィルタは,ハッシュフィルタ領域に作成されます。ハッシュフィルタ領域サイズは,サーバ定義またはクライアント定義のadb_sql_exe_hashflt_area_sizeオペランドで指定します。

(2) ハッシュジョインが適用される例

(例1)
SELECT * FROM "T1","T2" WHERE "T1"."C1"="T2"."C1"

指定の結合条件の両側に単独の列指定を指定した場合,ハッシュジョインが適用されます。

(例2)
SELECT * FROM "T1","T2" WHERE "T1"."C1"="T2"."C1"+10

次の条件を満たす場合,ハッシュジョインが適用されます。

  • 指定の結合条件の片側に単独の列指定を指定していて,もう片方には列指定を含むスカラ演算を指定している

(例3)
SELECT * FROM "T1" INNER JOIN "T2"
    ON "T1"."C1"=CAST("T2"."C1" AS INTEGER)

次の条件を満たす場合,ハッシュジョインが適用されます。

  • 指定の結合条件の片側に単独の列指定を指定していて,もう片方には列指定を含むスカラ関数を指定している

(例4)
SELECT * FROM "T1" LEFT JOIN "T2"
    ON "T1"."C1"="T2"."C1"||"T2"."C2"

次の条件を満たす場合,ハッシュジョインが適用されます。

  • 指定の結合条件の片側に単独の列指定を指定していて,もう片方には列指定を含む連結演算を指定している

(3) ハッシュジョインを適用する場合の留意事項

指定の結合条件の左右に指定した値式のデータ型とデータ長は,できる限り同じにしてください。指定の結合条件の左右に指定した値式のデータ型とデータ長が異なる場合,データ型とデータ長が同じ形式に変換されたあとにハッシュテーブルが作成されてハッシングが行われます。そのため,変換の分だけオーバヘッドが掛かります。

変換後のデータ型については,マニュアルHADB SQLリファレンス変換,代入,比較できるデータ型を参照してください。

なお,変換後のデータ型がDECIMAL型の場合,精度と位取りは次の計算式を基に決定されます。

計算式
精度=PmaxSmax
位取り=Smax
Pmax=MAX(p1s1p2s2Smax=MAX(s1s2

p1s1指定の結合条件の左側に指定した値式の精度と位取り

p2s2指定の結合条件の右側に指定した値式の精度と位取り

なお,変換前のデータ型がINTEGER型の場合は,DECIMAL(20,0)として計算されます。変換前のデータ型がSMALLINT型の場合は,DECIMAL(10,0)として計算されます。

(例)

変換後のデータ型がDECIMAL型の場合の精度と位取りの決定例を次に示します。

表の定義

CREATE TABLE "T1"("C1" INTEGER,"C2" CHAR(3),"C3" DATE) IN "DBAREA01"
CREATE TABLE "T2"("C1" DECIMAL(7,3),"C2" CHAR(3),"C3" DATE) IN "DBAREA01"

SQL文の例

SELECT * FROM "T1","T2" WHERE "T1"."C1"="T2"."C1"

下線部の指定の結合条件の左側に指定された列("T1"."C1")と,右側に指定された列("T2"."C1")は,データ型とデータ長が異なります。そのため,データ型とデータ長が変換されます。"T1"."C1"列はINTEGER型,"T2"."C1"列はDECIMAL型です。

この場合,指定の結合条件の左右に指定された列のデータ型はDECIMAL型に変換されます。"T1"."C1"列はDECIMAL(20,0)と仮定されます。変換後のDECIMAL型の精度と位取りは以下のように計算されます。

Pmax=MAX(p1s1p2s2)=MAX(20−0,7−3)=20
Smax=MAX(s1s2)=MAX(0,3)=3
精度=PmaxSmax=23
位取り=Smax=3

指定の結合条件の左右に指定された列のデータ型とデータ長をDECIMAL(23,3)に変換してハッシュテーブルが作成され,ハッシングが行われます。

(4) ハッシュテーブル領域が不足した場合の対処方法

■ハッシュテーブル領域が不足した場合の処理の流れ

ハッシュテーブルの作成中に,ハッシュテーブル領域が不足した場合の処理の流れを説明します。

  1. ハッシュテーブルの作成中にハッシュテーブル領域が不足した場合,外表のデータを複数の作業表に分割して格納します。また,内表のデータも,外表のデータと同様に複数の作業表に分割して格納します。

    [図データ]

    メモ

    上記の例では,外表の作業表が3つ,内表の作業表が3つ作成されていますが,SQL文の指定内容などによっては作成される作業表の個数が変わります。

  2. 外表の作業表(作業表B1)からハッシュテーブルを作成し,そのハッシュテーブルと内表の作業表(作業表P1)の突き合わせ処理を実行します。

    ハッシュテーブルと作業表P1の突き合わせ処理の完了後,作業表B2からハッシュテーブルを作成し,そのハッシュテーブルと作業表P2の突き合わせ処理を実行します。

    ハッシュテーブルと作業表P2の突き合わせ処理の完了後,作業表B3からハッシュテーブルを作成し,そのハッシュテーブルと作業表P3の突き合わせ処理を実行します。

    [図データ]

上記の2.の処理中にハッシュテーブル領域が不足した場合

上記の2.の処理中にハッシュテーブル領域が不足した場合,ハッシュテーブルに格納できなかったデータを別の作業表に格納します。この場合,内表の作業表とハッシュテーブルの突き合わせ処理のほかに,内表の作業表と新たに作成された作業表(作業表B4)との突き合わせ処理も発生します。

[図データ]

メモ

上記の2.の処理中にハッシュテーブル領域が不足して作業表(作業表B4)が新たに作成された場合,サーバメッセージログファイルにKFAA51130-Wメッセージが出力されます。

■ハッシュテーブル領域が不足した場合の対処方法

ハッシュテーブル領域が不足した場合,作業表を作成する時間や,突き合わせ処理に掛かる時間によって,SQL文の処理時間が長くなることがあります。ハッシュテーブル領域の不足を解消するには,サーバ定義またはクライアント定義のadb_sql_exe_hashtbl_area_sizeオペランドの指定値(ハッシュテーブル領域サイズの指定値)を大きくしてください。

(5) ハッシュジョインが適用されない条件

次に示すどれかの条件に該当する場合は,結合方式にハッシュジョインが適用されることはありません。

メモ

結合表の場合は,結合方式指定によって外表を指定することができます。結合方式指定については,マニュアルHADB SQLリファレンス結合方式指定の指定形式および規則を参照してください。

(6) ハッシュフィルタが適用される条件

  1. 次の条件をすべて満たす場合に,ハッシュジョインの際にハッシュフィルタが適用されます。

    • サーバ定義またはクライアント定義のadb_sql_exe_hashflt_area_sizeオペランドに0が指定されていない

    • コンマ結合またはINNER JOINの指定で表が結合されている

  2. サーバ定義またはクライアント定義のadb_sql_exe_hashflt_area_sizeオペランドに指定したハッシュフィルタ領域サイズが小さい場合,ハッシュ検索ごとに割り当てられるハッシュフィルタ領域が不足することがあります。その結果,ハッシュフィルタのサイズが不足したハッシュ検索がある場合,そのハッシュ検索にハッシュフィルタは適用されません。すべてのハッシュ検索に対してハッシュフィルタを適用したい場合は,次の条件式を満たすようにadb_sql_exe_hashflt_area_sizeオペランドの指定値を変更してください。

    adb_sql_exe_hashflt_area_sizeの指定値>↑A×B×SQL文の処理リアルスレッド数÷1024↑
    A

    ハッシュフィルタが適用されなかったハッシュ検索で使用するハッシュフィルタ数

    ハッシュフィルタが適用されなかったハッシュ検索が2つ以上ある場合は,ハッシュ検索ごとに数を求め,その中の最大値を代入してください。1つのハッシュ検索で使用するハッシュフィルタの数を次に示します。

    • ハッシュジョインの場合:ハッシュジョインの=結合条件数

    • ハッシュ実行が適用される副問合せのうち,外への参照を含まない副問合せの場合:1

    • ハッシュ実行が適用される副問合せのうち,外への参照を含む副問合せの場合:外への参照列を含む=条件の数

    B

    SQL文中に指定した次の数の合計値

    • ハッシュフィルタが適用されるハッシュジョインの数

    • ハッシュフィルタを使用したハッシュ実行が適用される副問合せの数