5.11.3 OR条件に関する等価変換(IN条件への変換)
OR条件中に同じ列に対する=条件が指定されている場合※,次に示す等価変換が実行されます。
-
同じ列に対する=条件をIN条件に変換する
-
同じ列に対する=条件をIN条件に変換して,OR条件の外側に追加する
IN条件に変換してOR条件の外側に追加すると,検索範囲を絞り込むための条件として有効に利用できることがありますが,IN条件を追加すれば条件評価の負荷が増えることもあります。
- 注※
-
ANYを指定した配列要素参照(識別番号は省略)が探索条件に指定されている場合は,探索条件が同じであっても等価変換は実行されません。具体例については,「(2) 等価変換されない例」の「(c) 例3」を参照してください。
- 重要
-
-
WHERE句の探索条件,更新系SQLのWHERE探索条件,結合表のON 探索条件,およびHAVING句の探索条件に指定したOR条件が等価変換の対象になります。
-
探索条件が等価変換された場合,検索時に使用されるインデクスは等価変換後の探索条件を基に決定されます。
-
等価変換の例を次に示します。例中のC1,C2,C3は列名を意味しています。
- 〈この項の構成〉
(1) 等価変換される例
(a) 例1
- [説明]
-
OR条件中に指定されているすべての条件が,C1列に対する=条件のため,IN条件に等価変換されます。
(b) 例2
- [説明]
-
OR条件中に指定されているC1列に対する=条件を,IN条件に変換してOR条件の外側に追加します。
(c) 例3
- [説明]
-
OR条件中に指定されている条件が,同じ配列要素参照に対する=条件("C1_ARRAY"[ANY(1)] = XXX)のため,OR条件がIN条件に等価変換されます。
(2) 等価変換されない例
(a) 例1
- [説明]
-
OR条件中に指定されているすべての条件が,C1列に対する=条件ですが,NOT条件中に指定されているため,等価変換されません。
(b) 例2
- [説明]
-
OR条件の両側に「"C1" = 100」と「"C1" = 200」というIN条件に等価変換される条件がありますが,AND条件に指定されたOR条件の場合は等価変換されません。
(c) 例3
- [説明]
-
OR条件に指定されている配列要素参照には識別番号が指定されていないため,HADBが各配列要素参照に異なる識別番号を割り振ります。そのため,指定された探索条件は同じではないと判定されて,等価変換されません。
(3) 等価変換の規則
-
比較述語で次に示す形式の場合は,OR条件の外側にIN条件を追加します。ただし,列指定に指定する列が外への参照列の場合は,等価変換されません。外への参照列については,マニュアルHADB SQLリファレンスの副問合せの指定形式および規則を参照してください。
{列指定|列指定[ANY〔(識別番号)〕]} = {定数|日時情報取得関数|ユーザ情報取得関数|?パラメタ}
{定数|日時情報取得関数|ユーザ情報取得関数|?パラメタ} = {列指定|列指定[ANY〔(識別番号)〕]}
-
次に示す場合は等価変換されません。
-
NOT条件中に指定されたOR条件の場合(「(2) 等価変換されない例」の「(a) 例1」を参照)
-
AND条件に指定されたOR条件の場合(「(2) 等価変換されない例」の「(b) 例2」を参照)
-