4.5.9 外への参照のある副問合せの実行方式
- 〈この項の構成〉
(1) 実行方式の種類
外への参照のある副問合せの実行方式及び特徴を次の表に示します。
実行方式 |
処理方式 |
長所 |
短所 |
---|---|---|---|
外側の問合せを1行検索するごとに,副問合せを実行して作業表を作成して,副問合せを含む条件を評価する方式です。 |
副問合せの探索条件のうち,外への参照列を含む条件に対して,インデクスを使用できます。したがって,副問合せの探索条件が,インデクスを使用することでサーチ範囲を絞り込める場合に高速に検索できます。 外側の問合せの検索で,外への参照列が同値の行を連続して検索した場合には,副問合せの検索を省略できます。 |
外側の問合せのヒット件数が多い場合には,性能が悪くなります。 |
|
外側の問合せを1行検索するごとに,副問合せを実行して(作業表は作成しない),副問合せを含む条件を評価する方式です。 |
副問合せの探索条件のうち,外への参照列を含む条件に対してインデクスを使用できます。したがって,副問合せの探索条件が,インデクスを使用することでサーチ範囲を絞り込める場合には高速に検索できます。 外側の問合せの検索で,外への参照列が同値の行を連続して検索した場合には,副問合せの検索を省略できます。 |
外側の問合せのヒット件数が多い場合には,性能が悪くなります。 |
|
あらかじめ副問合せ結果からハッシュ表を作成しておいて,外側の問合せを1行取り出すごとに外側の問合せの値をハッシングし,ハッシュ表と突き合わせをする方式です。 |
外への参照列を含む条件を除いた副問合せのヒット件数が少なく,外側の問合せの件数が多い場合,高速に検索できます。 |
外への参照列を含む条件にインデクスを使用できません。 外への参照列を含む条件を除いた副問合せのヒット件数が多い場合,使用する作業表用バッファサイズが大きくなります。使用する最大作業表用バッファサイズを指定できますが,作業表バッファ領域が一杯になった場合は,いったんファイルに退避するため,性能が悪くなります。 副問合せがジョインしている場合,外への参照列を含む条件の評価はジョイン後になります。 |
(2) 処理方式
(a) ネストループ作業表実行
- NESTED LOOPS WORK TABLE SUBQ
-
限定述語の右側,及びIN述語の右側の表副問合せに適用します。
まず,外側の問合せを実行します。このとき,外側の問合せを1行取り出すごとに外への参照列の値を使用して副問合せを実行し,副問合せの選択式の値を求めて作業表を作成します。次に,副問合せから作成した作業表を使用して,外側の副問合せを含む条件を評価します。
外側の問合せは1行ずつ処理するため,同時に複数の作業表領域を作成することはありません。外側の問合せの行数分,副問合せを実行するため,外側の問合せの行数が多い場合は,性能が悪くなります。
NESTED LOOPS WORK TABLE SUBQの処理方式を次の図に示します。
図4‒51 NESTED LOOPS WORK TABLE SUBQの処理方式 - 例:
SELECT C1 FROM T1 WHERE C1=ANY(SELECT C1 FROM T2 WHERE C2=T1.C2)
注 下線部が外への参照列となります。
外側の問合せを実行します。外側の問合せのすべての行に対して,外への参照列(T1.C2)の値を使用して副問合せを実行し,T2.C1の値から作業表を作成します。次に,T1.C1をT2.C1の作業表と突き合わせて,副問合せを含む条件を評価します。
(b) ネストループ行値実行
- NESTED LOOPS ROW VALUE SUBQ
-
行副問合せ,スカラ副問合せ,及びEXISTS述語に対して適用します。
まず,外側の問合せを実行します。このとき,外側の問合せを1行取り出すごとに外への参照列の値を使用して副問合せを実行し,副問合せの選択式の値を求めます(作業表は作成しません)。次に。副問合せ結果の値を使用して,外側の問合せの副問合せを含む条件を評価します
外側の問合せの行数分,副問合せを実行するため,外側の問合せの行数が多い場合は性能が悪くなります。
NESTED LOOPS ROW VALUE SUBQの処理方式を次の図に示します。
図4‒52 NESTED LOOPS ROW VALUE SUBQの処理方式 - 例:
SELECT C1 FROM T1 WHERE C1=(SELECT MAX(C1) FROM T2 WHERE C2=T1.C2)
注 下線部が外への参照列となります。
外側の問合せを実行します。外側の問合せのすべての行に対して,外への参照列(T1.C2)の値を使用して副問合せを検索し,MAX(T2.C1)の値を取り出します(作業表は作成しません)。次に,外側の問合せ中の副問合せを含む条件を評価します。
(c) ハッシュ実行
- HASH SUBQ
-
EXISTS述語,比較述語の右側,限定述語の右側,及びIN述語の右側の表副問合せに適用します。
まず,外への参照列を含む条件を除いて副問合せを実行し,問合せの選択式の値を求めます。このとき,副問合せ中の=で比較している探索条件から,外への参照列で絞り込んでいる列を使用してハッシュ表を作成します(=ANY,=SOME,IN述語の場合は,更に選択式の列も使用してハッシュ表を作成します)。
次に,外側の問合せを実行し,1行取り出すごとに外への参照列となる値でハッシングして(=ANY,=SOME,IN述語の場合は,更に述語の左辺の列も使用してハッシングします),副問合せから作成したハッシュ表と突き合わせて検索します。
HASH SUBQの処理方式を次の図に示します。
図4‒53 HASH SUBQの処理方式 EXISTS述語と比較述語の例を次に示します。
- 例1:EXISTS述語の場合
SELECT T1.C1 FROM T1 WHERE EXISTS(SELECT * FROM T2 WHERE C1='a' AND C2=T1.C2)
注 下線部が外への参照列となります。
まず,外への参照列が含まれる条件を除いて副問合せを評価し,外への参照列を使用して絞り込んでいる副問合せの列(T2.C2)の値でハッシュ表を作成します。次に,外側の問合せを実行し,外への参照列(T1.C2)の値でハッシングして,副問合せから作成したハッシュ表と突き合わせてEXISTS述語を評価します。
- 例2:比較述語の場合
SELECT T1.C1 FROM T1 WHERE T1.C3<(SELECT T2.C3 FROM T2 WHERE C1='a' AND C2=T1.C2)
注 下線部が外への参照列となります。
まず,外への参照列が含まれる条件を除いて副問合せを評価し,外への参照列で絞り込んでいる副問合せの列(T2.C2)からハッシュ表を作成します。次に,外側の問合せを実行し,外への参照列(T1.C2)の値でハッシングして,副問合せから作成したハッシュ表と突き合わせて外への参照列を含む条件を評価し,真の場合は更に比較述語(<)を評価します。