Hitachi

ノンストップデータベース HiRDB Version 10 UAP開発ガイド


4.5.8 外への参照のない副問合せの実行方式

〈この項の構成〉

(1) 実行方式の種類

外への参照のない副問合せの実行方式及び特徴を次の表に示します。

表4‒13 外への参照のない副問合せの実行方式及び特徴

実行方式

処理方式

長所

短所

作業表ATS実行

あらかじめ結果を求めて作業表を作成しておいて,外側の問合せに対してインデクスを使用して検索する場合に,副問合せ結果から作成した作業表を使用してサーチ範囲を絞り込む方式です。

外側の問合せに対してインデクスを使用できます。したがって,副問合せのヒット件数が少く,外側の問合せの件数が多い場合,インデクスを使用することでサーチ範囲を絞り込めるときに高速に検索できます。

副問合せの結果の行数分,外側の問合せに対してインデクスを使用して検索するため,副問合せのヒット件数が多い場合には性能が悪くなります。

作業表実行

あらかじめ副問合せの結果を求めて作業表を作成しておいて,外側の問合せを1行検索するごとに副問合せの結果から作成した作業表と突き合わせて,副問合せを含む述語を評価する方式です。

作業表を必要とするすべての副問合せの条件に対して適用できます。

外側の問合せの件数が多い場合には性能が悪くなります。

行値実行

あらかじめ副問合せを求めておいて(作業表は作成しません),外側の問合せを検索する場合に副問合せの結果の値を使用することで,副問合せを含む条件を評価する方式です。

外側の問合せに対してインデクスを使用できます。したがって,外側の問合せの件数が多い場合,インデクスを使用することでサーチ範囲を絞り込めるときは高速に検索できます。

外側の問合せの件数が多く,インデクスを使用して副問合せを含む述語を絞り込めない場合は,性能が悪くなります。

ハッシュ実行

あらかじめ副問合せ結果からハッシュ表を作成しておいて,外側の問合せを1行取り出すごとに外側の問合せの値をハッシングして,ハッシュ表と突き合わせをする方式です。

副問合せのヒット件数が少なく,外側の問合せの件数が多い場合,高速に検索できます。

副問合せのヒット件数が多い場合は,使用する作業表用バッファサイズが大きくなります。使用する作業表バッファサイズを指定できますが,作業表用バッファが一杯になった場合は,いったん作業表用ファイルへ退避するため,性能が悪くなります。

外への参照のない副問合せの最適な実行方式を次の表に示します。

表4‒14 外への参照のない副問合せの最適な実行方式

副問合せ

最適な実行方式

=ANY,=SOMEの限定述語の右側,及びIN述語の右側に指定した表副問合せ

外側の問合せ,副問合せのデータ件数によって異なります。

外側の問合せ:多い

副問合せ  :少ない

作業表ATS実行,又はハッシュ実行が有効です。

外側の問合せ:中間

副問合せ  :少ない

外側の問合せ:少ない

副問合せ  :少ない

外側の問合せ:多い

副問合せ  :中間

ハッシュ実行が有効です。

外側の問合せ:中間

副問合せ  :中間

外側の問合せ:少ない

副問合せ  :中間

ハッシュ実行,又は作業表実行が有効です。

外側の問合せ:多い

副問合せ  :多い

ハッシュ実行が有効です(データ件数が多いので性能向上は期待できません)。

外側の問合せ:中間

副問合せ  :多い

外側の問合せ:少ない

副問合せ  :多い

ハッシュ実行,又は作業表実行が有効です。なお,外への参照のあるEXISTS述語に変換すると,高速に検索できることがあります。

限定述語(=ANY及び=SOMEを除く)の右側,及びIN述語の右側に指定した表副問合せ

常に作業表実行が適用されます。

EXISTS述語の副問合せ

常に行値実行が適用されます。

上記以外の副問合せ(スカラ副問合せ,及び行副問合せ)

(2) 処理方式

(a) 作業表ATS実行

WORK TABLE ATS SUBQ

=ANY,=SOMEの限定述語の右側,及びIN述語の右側に指定した表副問合せに適用します。

まず,副問合せの選択式の値を求めて,作業表を作成します。次に,インデクスを使用して外側の問合せを検索します。このとき,副問合せの結果を使用してインデクスのサーチ範囲を絞り込んで検索します。問合せのサーチ条件種別はATS又はRANGESとなります。

なお,副問合せに対して,HiRDBが内部的に重複排除(DISTINCT)をすることがあります。

WORK TABLE ATS SUBQの処理方式を次の図に示します。

図4‒47 WORK TABLE ATS SUBQの処理方式

[図データ]

限定述語と比較述語の例を次に示します。

例:
SELECT C1 FROM T1 WHERE C2=ANY(SELECT C2 FROM T2)

注 T1(C2)にインデクスが定義されているものとします。

まず,副問合せの表T2を検索して,T2.C2の値から作業表を作成します。次に,作業表からT2.C2の値を1行ずつ取り出して,外側の問合せのT1.C2に定義したインデクスのサーチ範囲を絞り込んで検索します。

(b) 作業表実行

WORK TABLE SUBQ

限定述語の右側,及びIN述語の右側の表副問合せに適用します。

まず,副問合せの選択式の値を求めて,作業表を作成します。次に,外側の問合せを検索します。このとき,外側の問合せを1行検索するごとに副問合せの結果と突き合わせて探索条件を評価します。

WORK TABLE SUBQの処理方式を次の図に示します。

図4‒48 WORK TABLE SUBQの処理方式

[図データ]

例:
SELECT T1.C1 FROM T1 WHERE T1.C2=ANY(SELECT C2 FROM T2)

まず,副問合せの表T2を検索して,T2.C2の値から作業表を作成します。次に,外側の問合せを実行して1行ずつ取り出し,T1.C2の値を副問合せから作成した作業表と突き合わせて探索条件を評価します。

(c) 行値実行

ROW VALUE SUBQ

行副問合せ,スカラ副問合せ,及びEXISTS述語に対して適用します。

まず,副問合せの選択式の値を求めます。次に,副問合せ結果の値を使用して,外側の問合せの副問合せを含む条件を評価します。

比較述語では,外側の問合せを検索する場合にHiRDBがインデクスを使用した方がよいと判断したときには,インデクスを使用して検索します。

ROW VALUE SUBQの処理方式を次の図に示します。

図4‒49 ROW VALUE SUBQの処理方式

[図データ]

例を次に示します。

例:
SELECT T1.C1 FROM T1 WHERE T1.C2<(SELECT MAX(C2) FROM T2)

まず,副問合せの表T2を検索して,MAX(T2.C2)の値を取り出します(作業表は作成しません)。次に,外側の問合せ中の副問合せを含む条件を,MAX(T2.C2)の値を使用して評価します。

(d) ハッシュ実行

HASH SUBQ

限定述語の右側,及びIN述語の右側の表副問合せに適用します。

まず,副問合せの選択式の値を求めます。このとき,選択式の値からハッシュ表を作成します。次に,外側の問合せを実行し,限定述語及びIN述語の左側に指定した列の値でハッシングして,副問合せから作成したハッシュ表と突き合わせて検索します。

HASH SUBQの処理方式を次の図に示します。

図4‒50 HASH SUBQの処理方式

[図データ]

例を次に示します。

例:
SELECT T1.C1 FROM T1 WHERE T1.C2=ANY(SELECT C2 FROM T2)

まず,副問合せの表T2を検索して,T2.C2の値からハッシュを作成します。次に,外側の問合せを実行し,T1.C2の値でハッシングして,副問合せから作成したハッシュ表と突き合わせて検索します。