Hitachi

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


4.5.11 探索高速化条件の導出

探索高速化条件とは,WHERE句の探索条件,FROM句のON 探索条件から,CNF変換又は条件推移で新たに導出される条件のことをいいます。探索高速化条件を導出すると,検索する行が早い段階で絞り込まれるため,検索性能が向上します。

探索高速化条件を導出する場合,導出の元となる探索条件は残すため,絞り込みに使用できない条件は生成しないで,導出した条件の中で最適な条件だけを生成できます。

探索高速化条件を導出すると,HiRDBがアクセスパス(表の検索方法,結合方法,結合順序など)を決定する場合に,新しく導出した探索高速化条件も考慮して最適化をします。そのため,探索高速化条件を導出すると,アクセスパスは次のように変わることがあります。

なお,複雑な条件から探索高速化条件を導出すると,探索高速化条件を生成する時間,及び実行時の評価時間が長くなるため,SQLによっては性能が低下することがあります。

〈この項の構成〉

(1) 探索高速化条件の適用範囲

探索高速化条件を導出するかどうかは,SQL最適化オプション及びSQL拡張最適化オプションの指定値によって変わります。SQL最適化オプション及びSQL拡張最適化オプションと,探索高速化条件の導出の関係を次の表に示します。

表4‒17 SQL最適化オプション及びSQL拡張最適化オプションと探索高速化条件の導出の関係

種類

導出元となる条件

導出される条件

SQL最適化オプション及びSQL拡張最適化オプションの指定

探索高速化条件の導出をしない

探索高速化条件の導出をする※1

CNF変換

1表のORの条件

1表条件

×

×

2表以上にわたるORの条件

1表条件

※2

ORの簡約化で結合条件(列=列)が抜き出せる場合

※2

上記以外の2表以上の条件

×

×

条件推移

表A,Bの結合条件と,表Aの条件

表Bの1表条件

×

表A,Bの結合条件と,表A,Cの結合条件

表B,Cの結合条件

×

×

(凡例)

○:探索高速化条件を生成します。

×:探索高速化条件を生成しません。

注※1

SQL最適化オプションに「探索高速化条件の導出」を指定します。

注※2

探索高速化条件の導出元の検索に直積が指定されている場合,探索高速化条件を生成しますが,次に示す条件によって異なります。探索高速化条件の導出の可否とその条件を次に示します。

導出元の検索

導出の条件

導出される探索高速化条件

導出可否

2表検索

直積となる

ORの簡約化によって結合条件(列=列)が抜き出せない場合

導出元の探索条件に導出する1表条件と同じ表の1表条件がある場合

なし

×

導出元の探索条件に導出する1表条件と同じ表の1表条件がない場合

1表条件

結合条件(列=列)

上記以外の2表条件

×

ORの簡約化によって結合条件(列=列)が抜き出せる場合

導出元の探索条件に導出する1表条件と同じ表の1表条件がある場合

なし

×

導出元の探索条件に導出する1表条件と同じ表の1表条件がない場合

1表条件

結合条件(列=列)

上記以外の2表条件

×

直積とならない

×

3表以上の検索

すべて直積となる

ORの簡約化によって結合条件(列=列)が抜き出せない場合

導出元の探索条件に導出する1表条件と同じ表の1表条件がある場合

なし

×

導出元の探索条件に導出する1表条件と同じ表の1表条件がない場合

1表条件

結合条件(列=列)

上記以外の2表条件

×

一部がORの簡約化によって結合条件(列=列)が抜き出せる場合

導出元の探索条件に導出する1表条件と同じ表の1表条件がある場合

なし

×

導出元の探索条件に導出する1表条件と同じ表の1表条件がない場合

1表条件

結合条件(列=列)

上記以外の2表条件

×

ORの簡約化によって結合条件(列=列)が抜き出せる場合

導出元の探索条件に導出する1表条件と同じ表の1表条件がある場合

なし

×

導出元の探索条件に導出する1表条件と同じ表の1表条件がない場合

1表条件

結合条件(列=列)

上記以外の2表条件

×

一部が直積,その他が直積にならない

ORの簡約化によって結合条件(列=列)が抜き出せない場合

導出元の探索条件に導出する1表条件と同じ表の1表条件がある場合

なし

×

導出元の探索条件に導出する1表条件と同じ表の1表条件がない場合

1表条件

結合条件(列=列)

上記以外の2表条件

×

一部がORの簡約化によって結合条件(列=列)が抜き出せる場合

導出元の探索条件に導出する1表条件と同じ表の1表条件がある場合

なし

×

導出元の探索条件に導出する1表条件と同じ表の1表条件がない場合

1表条件

結合条件(列=列)

上記以外の2表条件

×

ORの簡約化によって結合条件(列=列)が抜き出せる場合

導出元の探索条件に導出する2表条件と同じ表の1表条件がある場合

なし

×

導出元の探索条件に導出する2表条件と同じ表の1表条件がない場合

1表条件

結合条件(列=列)

上記以外の2表条件

×

直積とならない

×

(凡例)

○:導出する

×:導出しない

−:該当しない

(2) CNF変換での探索高速化条件の導出

CNF変換とは,ORで結合した条件(DNF形式(Disjunctive Normal Form:選言標準形))を,ANDで結合された等価な条件(CNF形式(Conjunctive Normal Form:連言標準形))に変換することをいいます。WHERE句の探索条件,及びFROM句のON 探索条件に対してCNF変換をすることで,探索高速化条件を導出します。

(a) CNF変換で導出される探索条件

CNF変換で導出される探索条件を次に示します。

  • ORで結合した2表以上にわたる条件に対して,CNF変換することで1表条件が生成できる場合に,この条件を探索高速化条件として導出します。1表条件を導出することで結合する件数を絞り込めます。

  • ORで結合したすべての条件に2表の同じ結合条件(列=列だけ)が含まれる場合,この条件をCNF変換することで(結合条件 OR … OR 結合条件)が導出できます。そして,ORで結合した結合条件がすべて同じ条件で重複排除できる場合(ORの簡約化),結合条件を探索高速化条件として導出します。結合条件を導出することで,直積処理がなくなり,性能が向上します。

なお,SQL最適化オプション及びSQL拡張最適化オプションの指定によって,探索高速化条件を導出するかどうかが決まります。SQL最適化オプション及びSQL拡張最適化オプションと,探索高速化条件の導出の関係については,「探索高速化条件の適用範囲」を参照してください。

(b) CNF変換をしない条件

次のどれかに該当する場合,CNF変換での探索高速化条件の導出はしません。

  • 導出後の探索条件に副問合せが含まれる場合

  • 外結合で,ON 探索条件に指定した導出元の条件に対して,導出後の条件が外表に閉じる条件となる場合

  • 外結合で,WHERE句に指定した導出元の条件に対して,導出後の条件が内表に閉じる条件となる場合

  • 外結合で,WHERE句に指定した導出元の条件に対して,導出後の条件が2表以上の条件となる場合

  • 探索高速化条件を導出した結果,論理演算の最大ネスト数が255を超える場合

  • HAVING句に探索条件を指定した場合

  • 導出後の探索条件が直積後のジョインの結合条件となる場合

(3) 条件推移での探索高速化条件の導出

条件推移とは,二つ以上の条件から新たな条件を導き出すことをいいます。

条件推移で導出される探索条件を次に示します。

なお,SQL最適化オプション及びSQL拡張最適化オプションの指定によって,探索高速化条件を導出するかどうかが決まります。SQL最適化オプション及びSQL拡張最適化オプションと,探索高速化条件の導出の関係については,「探索高速化条件の適用範囲」を参照してください。

(a) 結合条件を介した1表条件の推移による探索高速化条件の導出

2表の結合条件(列=列だけ)と,結合列を含む1表条件がある場合に,結合相手の列に対して1表条件を導出します。例を次に示します。

T1.C1 = T2.C1 AND T1.C1 > 10
→T1.C1 = T2.C1 AND T1.C1 > 10 AND T2.C1 > 10
 
下線部分が,導出した探索高速化条件となります。
  • 条件推移の対象となる1表条件

    条件推移の対象となる1表条件を次に示します。

    • 列指定 比較演算子 {値指定|外への参照列}

      比較演算子(=,<>,^=,!=,<,<=,>,>=)の左右が逆の場合にも条件推移をします。

    • 列指定 IS 〔NOT〕 NULL

    • 列指定 〔NOT〕 IN (値指定〔,値指定〕…)

    • 列指定 〔NOT〕 LIKE パターン文字列 〔ESCAPE エスケープ文字〕

      結合列のデータ長が異なる場合,パターン文字列が定数で,かつ前方一致のときにだけ条件推移をします。

    • 列指定 〔NOT〕 XLIKE パターン文字列 〔ESCAPE エスケープ文字〕

      結合列のデータ長が異なる場合には条件推移をしません。

    • 列指定 BETWEEN {値指定|外への参照列} AND {値指定|外への参照列}

    • 列指定 〔NOT〕 SIMILAR TO パターン文字列 〔ESCAPE エスケープ文字〕

      結合列のデータ長が異なる場合,パターン文字列が定数で,かつLIKE述語と等価となる前方一致のときにだけ条件推移をします。

  • 条件推移をしない条件

    次のどれかに該当する場合,条件推移はしません。

    • 外結合の場合

    • 内結合の場合で,WHERE句の探索条件とFROM句のON 探索条件との間での条件推移の場合(3表以上の内結合をしている場合,複数のON 探索条件間での条件推移はします)

    • 結合列のデータ型が固定長と可変長の比較の場合

    • 結合列のデータ型がFLOAT又はSMALLFLTの場合

    • 繰返し列を使用して結合している場合

    • 探索高速化条件を導出した結果,論理演算の最大ネスト数が255を超える場合

    • HAVING句に探索条件を指定した場合

(b) 結合条件の推移での探索高速化条件の導出(UNIX版限定)

2表の結合条件(列=列だけ)と,どちらか片方の列と別の表の列との結合条件(列=列だけ)がある場合に,結合条件がない列同士から新たな結合条件を導出します。相関名の指定がある場合は,相関名が異なれば別の表とみなします。例を次に示します。

T1.C1 = T2.C1 AND T2.C1 = T3.C1
→T1.C1 = T2.C1 AND T2.C1 = T3.C1 AND T1.C1 = T3.C1
 
下線部分が,導出した探索高速化条件となります。
  • 結合条件の推移をしない条件

    次のどれかに該当する場合,結合条件の推移をしません。

    • 外結合の場合

    • 内結合の場合で,WHERE句の探索条件とFROM句のON 探索条件との間での条件推移(3表以上の内結合をしている場合,複数のON 探索条件間での条件推移はします)

    • 結合列のデータ型が固定長と可変長の比較の場合

    • 結合列のデータ型がFLOAT又はSMALLFLTの場合

    • 探索高速化条件を導出した結果,論理演算の最大ネスト数が255を超える場合

    • HAVING句に探索条件を指定した場合