5.6.1 外への参照列を含まない副問合せの処理方式とは
外への参照列を含まない副問合せの処理方式には,次の4種類があります。
-
作業表実行
-
行値実行
-
作業表行値実行
-
ハッシュ実行
各処理方式について説明します。
- 〈この項の構成〉
(1) 作業表実行
次に示す場合,作業表実行が適用されて副問合せの処理が実行されることがあります。
-
限定述語を指定した場合
-
IN述語中に表副問合せを指定した場合
作業表実行の適用例を次に示します。
- ■実行するSELECT文
-
SELECT "T1"."C1" FROM "T1" WHERE ABS("T1"."C2")=ANY(SELECT "T2"."C2" FROM "T2")
表T1のC2列には,B-treeインデクスおよびテキストインデクスが定義されていないものとします。
図5‒8 作業表実行の処理方式 - [説明]
-
-
副問合せの結果を作業表に格納します。
この例の場合,副問合せ中に指定した表T2を検索して,表T2のC2列の値を作業表に格納します。
-
副問合せの外側の問合せが実行されます。このとき,副問合せの外側の問合せを1行検索するごとに副問合せの結果(作業表)と突き合わせて探索条件を評価します。
この例の場合,表T1から1行ずつ取り出し,表T1のC2列の絶対値と,作業表に格納された表T2のC2列の値を突き合わせて探索条件を評価します。
-
(2) 行値実行
次に示す場合,行値実行が適用されて副問合せの処理が実行されることがあります。
-
スカラ副問合せを指定した場合
-
EXISTS述語を指定した場合
行値実行の適用例を次に示します。
- ■実行するSELECT文
-
SELECT "T1"."C1" FROM "T1" WHERE "T1"."C2"< (SELECT MAX("T2"."C2") FROM "T2")
図5‒9 行値実行の処理方式 - [説明]
-
-
副問合せの結果を求めます。
この例の場合,副問合せ中に指定した表T2を検索して,MAX("T2"."C2")を求めます。
-
副問合せの結果を使用して,副問合せの外側の問合せの副問合せを含む条件を評価します。比較述語の場合は,副問合せの外側の問合せを実行する際に,B-treeインデクスまたはテキストインデクスを使用することがあります。
この例の場合,1.で求めたMAX("T2"."C2")を条件値として,表T1を検索します。条件によっては,B-treeインデクスまたはテキストインデクスを使用して検索します。
-
(3) 作業表行値実行
次に示す場合,作業表行値実行が適用されて副問合せの処理が実行されることがあります。
-
限定述語を指定した場合
-
IN述語中に表副問合せを指定した場合
作業表行値実行の適用例を次に示します。
- ■実行するSELECT文
-
SELECT "T1"."C1" FROM "T1" WHERE "T1"."C2"=ANY(SELECT "T2"."C2" FROM "T2")
表T1のC2列には,B-treeインデクスが定義されているものとします。
図5‒10 作業表行値実行の処理方式 - [説明]
-
-
副問合せの結果を作業表に格納します。
この例の場合,副問合せ中に指定した表T2を検索して,表T2のC2列の値を作業表に格納します。
-
作業表から行値を1行ずつ取り出して副問合せの外側の問合せを実行し,探索条件を評価します。このとき,B-treeインデクスを使用します。テキストインデクスが定義されている場合は,テキストインデクスを使用します。
この例の場合,作業表から表T2のC2列の値を1行ずつ取り出して,表T1のC2列に定義したB-treeインデクスを使用して表T1を検索します。
-
(4) ハッシュ実行
ハッシュテーブルを使用した副問合せの処理方式をハッシュ実行といいます。次の場合に,ハッシュ実行が適用されることがあります。
-
限定述語を指定した場合
-
IN述語中に表副問合せを指定した場合
副問合せの処理方式にハッシュ実行が適用された場合,最初に,副問合せの結果を基にハッシュテーブルを作成します。次に,副問合せの外側の問合せを実行し,限定述語の左側に指定した列(またはIN述語の左側に指定した列)の値からハッシュ値を生成します。最後に,ハッシュ値とハッシュテーブルの突き合わせ処理を行います。
また,ハッシュテーブルを作成する際,同時にハッシュフィルタを作成します。ハッシュ値とハッシュテーブルの突き合わせ処理をする前に,ハッシュフィルタを使用してハッシュ値のフィルタリングを行います。これによって,ハッシュ値とハッシュテーブルの突き合わせ回数を削減することができます。
ハッシュ実行の適用例を次に示します。
- ■実行するSELECT文
-
SELECT "T1"."C1" FROM "T1" WHERE "T1"."C2"=ANY(SELECT "T2"."C2" FROM "T2")
図5‒11 ハッシュ実行の処理方式 - [説明]
-
-
副問合せ(上記のSQL文の例の下線部分)の結果を基に,ハッシュテーブルとハッシュフィルタを作成します。上記の例の場合,副問合せ中に指定した表T2を検索し,表T2のC2列の値からハッシュテーブルとハッシュフィルタを作成します。
-
副問合せの外側の問合せを実行し,限定述語の左側に指定した列(上記のSQL文の例の場合は表T1のC2列)の値からハッシュ値を生成します。そのハッシュ値をハッシュフィルタでチェックします。上記の例の場合,表T1から1行ずつ取り出して,表T1のC2列の値からハッシュ値を生成し,ハッシュフィルタでそのハッシュ値をチェックします。
-
ハッシュフィルタを通過したハッシュ値と,ハッシュテーブルの突き合わせ処理を行います。
なお,次の2つの条件を満たす場合,ハッシュ実行の処理の際にレンジインデクスが使用されることがあります。
-
副問合せの外側の問合せに指定された表(上記の例の表T1)に対して,限定述語またはIN述語の左側に指定した列(上記の例の列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を指定した場合,ハッシュ実行の際にハッシュフィルタは適用されません。
- ■ハッシュテーブル領域が不足した場合の処理の流れ
-
ハッシュテーブルの作成中に,ハッシュテーブル領域が不足した場合の処理の流れを説明します。
なお,説明文中の表T1,T2は,「図5‒11 ハッシュ実行の処理方式」の表T1,T2と対応しています。
-
ハッシュテーブルの作成中にハッシュテーブル領域が不足した場合,表T2のデータを複数の作業表に分割して格納します。また,表T1のデータも,表T2のデータと同様に複数の作業表に分割して格納します。
- メモ
-
上記の例では,表T2の作業表が3つ,表T1の作業表が3つ作成されていますが,SQL文の指定内容などによっては作成される作業表の個数が変わります。
-
表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) ハッシュフィルタが適用される条件」を参照してください。