5.11.4 OR条件に関する等価変換(集合演算UNION ALLを指定した導出表への等価変換)
指定したSQL文が次の2つの条件を満たす場合,SQL文が等価変換されることがあります。
-
FROM句にコンマ結合または結合表を指定している
-
WHERE句にOR条件を指定している
OR条件に指定した探索条件を,集合演算UNION ALLを指定した導出表に等価変換します。この等価変換の詳細を例を使って説明します。例中のT1,T2は表名を意味し,C1は列名を意味しています。
- ■等価変換前のSQL文(指定されたSQL文)
-
上記のSQL文では,FROM句にコンマ結合を指定し,かつWHERE句にOR条件を指定しているため(上記の例の下線部分),SQL文が等価変換されます。
- ■等価変換後のSQL文
-
上記のSQL文のように,集合演算UNION ALLを指定した導出表への等価変換が行われます。等価変換前のSQL文のOR条件に指定した探索条件(等価変換前のSQL文の1の個所)が,等価変換後の各集合演算項の問合せ指定の探索条件(等価変換後のSQL文の2と3の個所)にそれぞれ指定されます。
- ■等価変換のメリット
-
等価変換前のSQL文の場合,WHERE句にOR条件があるため,表の結合処理が行われたあとに探索条件の評価が行われます。
一方,等価変換後のSQL文の場合,各集合演算項のWHERE句にOR条件がないため,探索条件の評価が行われたあとに表の結合処理が行われます。これによって,表の結合処理を行う際に必要となる入力行数を削減できることがあります(検索性能が向上することがあります)。
また,"T1"."C1"列,"T2"."C1"列にインデクスが定義されている場合は,検索時にインデクスが使用されます。検索時に使用されるインデクスは,等価変換後の探索条件を基に決定されます。
ただし,等価変換によって問合せ指定や探索条件が増えるため,場合によっては検索時間が逆に長くなるケースもあります。
- 〈この項の構成〉
(1) 等価変換の例
等価変換の例を次に示します。例中のT1,T2,T3は表名を意味し,C1は列名を意味しています。
- (例1)探索条件にOR条件を2つ指定している場合
-
[説明]
-
等価変換前のSQL文では,FROM句に結合表を指定し,かつWHERE句にOR条件を指定しているため(上記の例の下線部分),SQL文が等価変換されます。
-
等価変換前のSQL文のOR条件に指定した各探索条件が,等価変換後の各集合演算項の問合せ指定の探索条件にそれぞれ指定されます。等価変換前のSQL文のようにOR条件を2つ指定している場合は,等価変換後の集合演算項が3つになります。
-
- (例2)探索条件にAND条件とOR条件を指定している場合
-
[説明]
-
等価変換前のSQL文では,FROM句にコンマ結合を指定し,かつWHERE句にOR条件を指定しているため(上記の例の下線部分),SQL文が等価変換されます。
-
等価変換前のSQL文のOR条件に指定した各探索条件が,等価変換後の各集合演算項の問合せ指定の探索条件にそれぞれ指定されます。等価変換前のSQL文のAND条件の左側に指定した探索条件は,等価変換後のすべての集合演算項の問合せ指定の探索条件に指定されます。
-
(2) 等価変換の適用条件
次の条件をすべて満たす場合に,等価変換が行われます。
- ■サーバ定義またはクライアント定義についての条件
-
次の条件をすべて満たす必要があります。
-
サーバ定義またはクライアント定義のadb_sql_exe_hashtbl_area_sizeオペランドに0を指定していないこと。
-
サーバ定義のadb_sys_uthd_numオペランドに0を指定していないこと。
-
サーバ定義またはクライアント定義のadb_sql_exe_max_rthd_numオペランドに0を指定していないこと。
-
- ■SQL文についての条件
-
次の条件をすべて満たす必要があります。
-
検索系SQLであること。
-
SQL文中に指定しているどれかの表に対して,バージョン04-03以降のHADBサーバでコスト情報を収集していること。
-
SQL文中に外への参照列を含む問合せ指定がないこと。
-
- ■問合せ指定についての条件
-
次の条件をすべて満たす必要があります。
-
選択式についての条件
-
選択式にROWが指定されていないこと。
-
-
FROM句に指定する表参照についての条件
-
選択式に指定した表数が16以下であること(ただし,集まり導出表は表数に含めない)。
-
FROM句にコンマ結合が指定されていること。
コンマ結合だけを指定している場合,またはコンマ結合と結合表の両方を混在して指定している場合に適用条件を満たします。
また,指定できる表の種別を次に示します。次の表の種別が混在して指定されていても適用条件を満たします。
・実表(ただし,アーカイブマルチチャンク表が指定されている場合は,等価変換されません)
・結合表(ただし,FULL OUTER JOINが指定されている場合は,等価変換されません)
・導出表(表副問合せ,問合せ名,およびビュー表が該当します)
・集まり導出表
-
-
- ■結合条件についての条件
-
次の条件をすべて満たす必要があります。
-
結合表の結合指定中にOR条件が指定されていないこと。
-
OR条件中に指定した列が属する表,またはその表に定義されている配列型の列を指定した集まり導出表の結合条件が,次の条件を満たしていること。
-
OR条件中に指定した列が属する表,またはその表に定義されている配列型の列を指定した集まり導出表の間に,「列指定=列指定」の形式の結合条件が1つ以上存在すること。
-
-
集合演算UNION ALLを指定した導出表への等価変換を行う際,各集合演算項の問合せ指定の探索条件に,結合対象のすべての表に対する結合条件が存在すること。
-
- ■WHERE句に指定する探索条件についての条件
-
次の条件をすべて満たす必要があります。
-
論理演算子ANDに指定する条件に,OR条件を指定した条件が複数個指定されていないこと。
(例)
-
適用条件を満たす例
条件1 AND 条件2 AND (条件3 OR 条件4 OR 条件5)
OR条件を指定した条件が1つだけ指定されているため,適用条件を満たします。
-
適用条件を満たさない例
(条件1 OR 条件2) AND 条件3 AND (条件4 OR 条件5)
OR条件を指定した条件が2つ指定されているため,適用条件を満たしません。
-
OR条件がネストして複数個指定されている場合も適用条件を満たします。
-
OR条件以外の連続した探索条件中に指定する表の数は考慮しません(結合指定でなくてもよい)。
-
NOTが指定されたOR条件は適用条件を満たしません。
-
-
OR条件中に結合表の列が指定されていないこと。
ただし,結合表がコンマ結合に変換された場合は,適用条件を満たします。
-
OR条件中に指定されている列の表に配列型の列が定義されている場合,その配列型の列が次のどれかに指定されていないこと。
-
選択式の値式
-
ソート指定リストのソートキー
-
GROUP BY句のグループ化指定
-
HAVING句の探索条件
-
次のどれかを含む探索条件中
・OR条件中に指定された列の表以外の表の列を指定している探索条件
・スカラ関数RANDOMまたはRANDOM_NORMALを指定している探索条件
・副問合せを指定している探索条件
-
次のどれかの探索条件を含むNOTの中に指定された探索条件中
・OR条件中に指定された列の表以外の表の列を指定している探索条件
・スカラ関数RANDOMまたはRANDOM_NORMALを指定している探索条件
・副問合せを指定している探索条件
-
-
OR条件に副問合せが指定されていないこと。
- OR条件中に行値構成子を指定した探索条件が指定されていないこと。
-
OR条件にスカラ関数RANDOMまたはRANDOM_NORMALが指定されていないこと。
-
論理演算子ORの数が15以下であること。
-
OR条件に2表以上に対する探索条件が含まれていること。
-
等価変換後の集合演算項の各探索条件中に,次のどれかの形式の探索条件が1つ以上含まれていること。また,これらの条件に対して論理演算子ORやNOTが指定されていないこと。
-
比較述語
{列指定|列指定[ANY〔(識別番号)〕]※} 比較演算子 {定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数}
{定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数} 比較演算子 {列指定|列指定[ANY〔(識別番号)〕]※}
-
BETWEEN述語
{列指定|列指定[ANY〔(識別番号)〕]※} BETWEEN {定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数} AND {定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数}
-
IN述語
{列指定|列指定[ANY〔(識別番号)〕]※} IN ({定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数} 〔,{定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数}〕…)
-
LIKE述語
{列指定|列指定[ANY〔(識別番号)〕]※} LIKE パターン文字列 〔ESCAPE エスケープ文字〕 パターン文字列::={定数|?パラメタ|日時情報取得関数|ユーザ情報取得関数} エスケープ文字::={定数|?パラメタ}
-
LIKE_REGEX述語
{列指定|列指定[ANY〔(識別番号)〕]※} LIKE_REGEX 正規表現文字列 〔FLAG {I|IGNORECASE}〕 正規表現文字列::=定数
-
NULL述語
{列指定|列指定[ANY〔(識別番号)〕]※} IS NULL
- 注※
-
WHERE句中にこの配列要素参照と同じ識別番号を持つ配列要素参照が指定されている場合,そのSQL文は等価変換されません。
- メモ
-
スカラ演算の中に定数だけを指定している場合,そのスカラ演算は定数として扱われることがあります。定数と等価なスカラ演算については,マニュアルHADB SQLリファレンスの値式の指定形式および規則の規則にある表定数と等価な値式となる条件を参照してください。
-
-
- ■等価変換が適用される問合せ指定の指定個所についての条件
-
問合せ指定が次の個所に指定された場合に,等価変換を適用するかどうかのチェックをHADBサーバが行います。
-
問合せ式中の問合せ式本体
-
スカラ副問合せ
-
表副問合せ
-
集合演算の各集合演算項
SQL文が等価変換されてUNION ALLを指定した導出表が作成された結果,集合演算の個数の上限を超えた場合でも,SQL文の等価変換が行われます。
-
WITHリスト要素
再帰的メンバの問合せ指定に対しては,等価変換を適用しません。
-
CREATE VIEW文中の問合せ式
-