4.5.11 探索高速化条件の導出
探索高速化条件とは,WHERE句の探索条件,FROM句のON 探索条件から,CNF変換又は条件推移で新たに導出される条件のことをいいます。探索高速化条件を導出すると,検索する行が早い段階で絞り込まれるため,検索性能が向上します。
探索高速化条件を導出する場合,導出の元となる探索条件は残すため,絞り込みに使用できない条件は生成しないで,導出した条件の中で最適な条件だけを生成できます。
探索高速化条件を導出すると,HiRDBがアクセスパス(表の検索方法,結合方法,結合順序など)を決定する場合に,新しく導出した探索高速化条件も考慮して最適化をします。そのため,探索高速化条件を導出すると,アクセスパスは次のように変わることがあります。
-
検索する行が早い段階で絞り込まれると判断して,インデクスを使用した検索が選ばれやすくなります。
-
結合条件にORを指定している場合に,CNF変換とORの簡約化で結合条件をORの外側に抜き出せるときは,直積以外にもネストループジョイン,マージジョイン,及びハッシュジョインができるようになります。
-
結合する場合に,片方の表だけに制限条件が付くときはネストループジョインが選ばれやすくなり,両方の表に制限条件が付くときはマージジョイン又はハッシュジョインが選ばれやすくなります。
なお,複雑な条件から探索高速化条件を導出すると,探索高速化条件を生成する時間,及び実行時の評価時間が長くなるため,SQLによっては性能が低下することがあります。
(1) 探索高速化条件の適用範囲
探索高速化条件を導出するかどうかは,SQL最適化オプション及びSQL拡張最適化オプションの指定値によって変わります。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) 条件推移での探索高速化条件の導出
条件推移とは,二つ以上の条件から新たな条件を導き出すことをいいます。
条件推移で導出される探索条件を次に示します。
-
結合条件を介した1表条件の推移による探索高速化条件の導出
-
結合条件の推移での探索高速化条件の導出(UNIX版限定)
なお,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句に探索条件を指定した場合
-