5.11.5 スカラ演算に関する等価変換
探索条件の片方の項に,列指定※1を含むスカラ演算が指定されている場合,スカラ演算の部分が移項されます(片方の項が列指定※1だけになるように探索条件が等価変換されます)。次の条件をすべて満たす場合に,スカラ演算の移項が行われます。
-
演算項が次のどちらかの条件を満たしている
-
演算項が「列指定※1と定数」の四則演算(加減算だけ)である
-
演算項が「列指定※1とラベル付き間隔」の日時演算である
-
-
列指定の列のデータ型※2が,SMALLINT,INTEGER,BIGINT,TIME,DATE,またはTIMESTAMPのどれかである
-
スカラ演算が入れ子になっていない
- 注※1
-
列指定のほかに,配列値式が列指定でANYを指定した配列要素参照も該当します。配列要素参照の場合も列指定のときと同様に,スカラ演算の部分が移項されて,片方の項が配列要素参照だけになるように探索条件が等価変換されます。
- 注※2
-
配列要素参照の場合は,配列値式の結果のデータ型となります。
- 重要
-
探索条件が等価変換された場合,検索時に使用されるインデクスは等価変換後の探索条件を基に決定されます。
等価変換の例を次に示します。例中のC1は列名を意味しています。
なお,以降では,列指定のときの等価変換の例を記載しています。配列要素参照の場合は,列指定を配列要素参照に置き換えてください。
- 〈この項の構成〉
(1) 等価変換される例
(a) 例1
- [説明]
-
列指定を含む項に「+10」というスカラ演算があります。このスカラ演算が右辺に移項され,列指定だけの条件に等価変換されます。等価変換後,「列指定 比較演算子 定数」の形式になるため,検索時にインデクスが使用されます。
(b) 例2
- [説明]
-
列指定を含む項に「+1 DAY」というスカラ演算があります。このスカラ演算が右辺に移項され,列指定だけの条件に等価変換されます。等価変換後,「列指定 比較演算子 定数」の形式になるため,検索時にインデクスが使用されます。
(c) 例3
- [説明]
-
列指定を含む項に「+10」というスカラ演算があります。このスカラ演算が右辺に移項され,列指定だけの条件に等価変換されます。等価変換後,「列指定 BETWEEN 定数」の形式になるため,検索時にインデクスが使用されます。
(d) 例4
- [説明]
-
列指定を含む項に「+10」というスカラ演算があります。このスカラ演算が右辺に移項され,列指定だけの条件に等価変換されます。等価変換後,「列指定 IN 定数」の形式になるため,検索時にインデクスが使用されます。
(e) 例5
- [説明]
-
列指定を含む行値構成子要素に「+10」および「+20」というスカラ演算があります。このスカラ演算がIN述語の右側の対応する行値構成子要素に移項され,列指定だけの条件に等価変換されます。等価変換後,「列指定 IN 定数」の形式になるため,検索時にインデクスが使用されます。
(2) 等価変換されない例
(a) 例1
- [説明]
-
列指定を含むスカラ演算が入れ子になっているため,等価変換されません。
(3) 等価変換の規則
-
比較述語で次に示す形式の場合は,スカラ演算の部分が移項され,列指定,または配列値式が列指定のANYを指定した配列要素参照だけの条件に等価変換されます。
{列指定|列指定[ANY〔(識別番号)〕]} {+|-} 定数 比較演算子 定数
定数 比較演算子 {列指定|列指定[ANY〔(識別番号)〕]} {+|-} 定数
なお,次に示すすべての条件を満たす場合は,等価変換されません。
-
列指定,または配列値式が列指定のANYを指定した配列要素参照を含むスカラ演算に,ラベル付き間隔のYEARまたはMONTHが指定されている
-
比較述語の比較演算子に,<>,!=,^=のどれかが指定されている
-
-
BETWEEN述語で次に示す形式の場合は,スカラ演算の部分が移項され,列指定,または配列値式が列指定のANYを指定した配列要素参照だけの条件に等価変換されます。
{列指定|列指定[ANY〔(識別番号)〕]} {+|-} 定数 〔NOT〕 BETWEEN 定数 AND 定数
なお,次に示すすべての条件を満たす場合は,等価変換されません。
-
列指定,または配列値式が列指定のANYを指定した配列要素参照を含むスカラ演算に,ラベル付き間隔のYEARまたはMONTHが指定されている
-
BETWEEN述語でNOT BETWEENが指定されている
-
-
行値構成子を指定していないIN述語で次に示す形式の場合は,スカラ演算の部分が移項され,列指定,または配列値式が列指定のANYを指定した配列要素参照だけの条件に等価変換されます。
{列指定|列指定[ANY〔(識別番号)〕]} {+|-} 定数 〔NOT〕 IN (定数,…)
なお,列指定,または配列値式が列指定のANYを指定した配列要素参照を含むスカラ演算に,ラベル付き間隔のYEARまたはMONTHが指定されている場合は,等価変換されません。
-
行値構成子を指定しているIN述語で次に示す形式の場合は,スカラ演算の部分が移項され,列指定だけの条件に等価変換されます。
行値構成子1 〔NOT〕 IN (行値構成子2 〔,行値構成子2〕…) 行値構成子1::=(列指定 {+|-} 定数 〔,列指定 {+|-} 定数〕…) 行値構成子2::=(定数 〔,定数〕…)
なお,IN述語の左側の行値構成子1に指定した列指定に,ラベル付き間隔のYEARまたはMONTHが指定されている場合は,等価変換されません。