Hitachi

Hitachi Advanced Data Binder AP開発ガイド


5.6.3 外への参照列を含む副問合せの処理方式とは

外への参照列を含む副問合せの処理方式には,次の3種類があります。

ネストループ行値実行の場合,副問合せの実行回数を減らすために,副問合せの結果を格納するキャッシュを作成することがあります。

各処理方式について説明します。

〈この項の構成〉

(1) ネストループ作業表実行

次に示す場合,ネストループ作業表実行が適用されて副問合せの処理が実行されることがあります。

ネストループ作業表実行の適用例を次に示します。

■実行するSELECT
SELECT "T1"."C1" FROM "T1"
    WHERE "T1"."C1"=ANY(SELECT "T2"."C1" FROM "T2"
                            WHERE "T2"."C2"="T1"."C2")
図5‒12 ネストループ作業表実行の処理方式

[図データ]

[説明]
  1. 副問合せの外側の問合せを実行します。

    この例の場合,表T1を検索します。

  2. 副問合せの外側の問合せを1行取り出すごとに,外への参照列の値を使用して副問合せを実行します。

    この例の場合,表T1の検索結果1行ごとに,外への参照列("T1"."C2")の値を条件値に使用して表T2を検索します。

  3. 実行した副問合せの結果を基に作業表を作成します。

    この例の場合,表T2を検索して"T2"."C1"の値を作業表に格納します。

  4. 作成した作業表を使用して,副問合せの外側の副問合せを含む条件を評価します。

    この例の場合,表T1の検索結果1行ごとに,対応する作業表の"T2"."C1"の値と突き合わせて副問合せを含む条件を評価します。

(2) ネストループ行値実行

次に示す場合,ネストループ行値実行が適用されて副問合せの処理が実行されることがあります。

ネストループ行値実行の適用例を次に示します。

■実行するSELECT
SELECT "T1"."C1" FROM "T1"
    WHERE "T1"."C1"=(SELECT MAX("T2"."C1") FROM "T2"
                         WHERE "T2"."C2"="T1"."C2")
図5‒13 ネストループ行値実行の処理方式

[図データ]

[説明]
  1. 副問合せの外側の問合せを実行します。

    この例の場合,表T1を検索します。

  2. 副問合せの外側の問合せを1行取り出すごとに,外への参照列の値を使用して副問合せを実行します。

    この例の場合,表T1の検索結果1行ごとに外への参照列("T1"."C2")の値を使用して,副問合せの結果MAX("T2"."C1")を求めます。

  3. 実行した副問合せの結果を求めます(作業表は作成しません)。副問合せの結果を使用して,副問合せの外側の副問合せを含む条件を評価します。

    この例の場合,表T1の検索結果1行ごとに,対応するMAX("T2"."C1")の値を使用して条件を評価します。

(3) ハッシュ実行

ハッシュテーブルを使用した副問合せの処理方式をハッシュ実行といいます。次の場合に,ハッシュ実行が適用されることがあります。

副問合せの処理方式にハッシュ実行が適用された場合,最初に,外への参照列を含む条件を除外して副問合せを実行し,その結果からハッシュテーブルを作成します。次に,副問合せの外側の問合せを実行し,外への参照列の値からハッシュ値を生成します。最後に,ハッシュ値とハッシュテーブルの突き合わせ処理を行います。

また,ハッシュテーブルを作成する際,同時にハッシュフィルタを作成します。ハッシュ値とハッシュテーブルの突き合わせ処理をする前に,ハッシュフィルタを使用してハッシュ値のフィルタリングを行います。これによって,ハッシュ値とハッシュテーブルの突き合わせ回数を削減することができます。

ハッシュ実行の適用例を次に示します。

■実行するSELECT
SELECT "T1"."C1" FROM "T1"
   WHERE "T1"."C3"<(SELECT "T2"."C3" FROM "T2"
                        WHERE "T2"."C1"='A' AND "T2"."C2"="T1"."C2")
図5‒14 ハッシュ実行の処理方式

[図データ]

[説明]
  1. 外への参照列を含む条件(上記のSQL文の例の下線部分)を除外して副問合せを実行し,その結果を基にハッシュテーブルとハッシュフィルタを作成します。

  2. 副問合せの外側の問合せを実行し,外への参照列("T1"."C2")の値からハッシュ値を生成します。そのハッシュ値をハッシュフィルタでチェックします。上記の例の場合,表T1を検索し,外への参照列("T1"."C2")からハッシュ値を生成し,ハッシュフィルタでそのハッシュ値をチェックします。

  3. ハッシュフィルタを通過したハッシュ値と,ハッシュテーブルの突き合わせ処理を行います。

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

  • 副問合せの外側の問合せに指定された表(上記の例の表T1)に対して,外への参照列(上記の例の列T1.C2)にレンジインデクスが定義されている

  • レンジインデクスが使用される条件を満たしている

    レンジインデクスが使用される条件については,「5.3.1 SQL文の実行時にレンジインデクスが使用される条件」を参照してください。

上記の2つの条件を満たす場合,ハッシュ実行の処理の際に,外への参照列を含む条件を除外して副問合せを実行した結果からハッシュテーブルを作成するときに,外への参照列と比較する列の最大値と最小値を求めます。そして,副問合せの外側の問合せに指定された表を検索するときにレンジインデクスを使用して,先に求めた外への参照列と比較する列の最大値と最小値の範囲外となる当該表(上記の例の表T1)のチャンクまたはセグメントをスキップします。

ハッシュテーブルはハッシュテーブル領域に作成されます。ハッシュテーブル領域サイズは,サーバ定義またはクライアント定義のadb_sql_exe_hashtbl_area_sizeオペランドで指定します。なお,adb_sql_exe_hashtbl_area_sizeオペランドに0を指定した場合,ハッシュ実行は適用されません。

ハッシュフィルタは,ハッシュフィルタ領域に作成されます。ハッシュフィルタ領域サイズは,サーバ定義またはクライアント定義のadb_sql_exe_hashflt_area_sizeオペランドで指定します。なお,adb_sql_exe_hashflt_area_sizeオペランドに0を指定した場合,ハッシュ実行の際にハッシュフィルタは適用されません。

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

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

なお,説明文中の表T1T2は,「図5‒14 ハッシュ実行の処理方式」の表T1T2と対応しています。

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

    [図データ]

    メモ

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

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

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

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

    [図データ]

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

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

[図データ]

メモ

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

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

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

■ハッシュフィルタ領域が不足した場合の対処方法

サーバ定義またはクライアント定義のadb_sql_exe_hashflt_area_sizeオペランドに指定したハッシュフィルタ領域サイズが小さい場合,ハッシュ検索ごとに割り当てられるハッシュフィルタ領域が不足することがあります。その結果,ハッシュフィルタのサイズが不足したハッシュ検索がある場合,そのハッシュ検索にハッシュフィルタは適用されません。すべてのハッシュ検索に対してハッシュフィルタを適用したい場合は,adb_sql_exe_hashflt_area_sizeオペランドの指定値を大きくしてください。指定値の見積もり式については,「5.5.2 ハッシュジョインとは」の「(6) ハッシュフィルタが適用される条件」を参照してください。