17.5.12 キー条件
- 〈この項の構成〉
(1) キー条件の概要
- KeyCnd:キー条件
-
キー条件とは,インデクスの構成列だけで評価できる条件のことをいいます。
データページを参照しないでインデクスページだけで探索条件を評価できるため,高速に検索できます。サーチ条件でインデクスのサーチ範囲を絞り込んだ後に,キー条件で評価すると効果的です。サーチ条件,及びキー条件で評価できない述語については,データページを検索する際に評価します。
キー条件が複数ある場合には,条件をAND,又はORで結合した形になります。
AND,及びORの優先順位によって,( )で囲んで表示します。
(a) サーチ条件とキー条件の両方を持つ場合
サーチ条件でインデクスを絞り込んで,キー条件で評価します。
- 例) where T1.C1 between 'a' and 'z' and T1.C1 like '%c'
- 例) where XMLEXISTS('/A/B/C/D/E[./F<8 and ./F>2 and ./F<>5] '
-
passing by value T1.C1)
(b) キー条件だけ持つ場合
インデクスの端から端までをキー条件で評価します。インデクスの全範囲をサーチする必要があるため,サーチ条件とキー条件の両方がある場合に比べて,性能的に遅くなります。
- 例) where T1.C1 like '%c'
- 例) where XMLEXISTS('/A/B/C/D/E[./F<>0] 'passing by value T1.C1 )
(c) 実行時にキー条件が削除される場合
パターン文字列に埋込み変数,?パラメタ,SQL変数,SQLパラメタを持つLIKE述語,又はSIMILAR述語を指定すると,実行時に与えられるパターン文字列が’abc%d’のような場合には,サーチ条件で’abc’から始まる値をサーチし,キー条件で最後が’d’で終わるかどうかを判定します。しかし,実行時に与えられるパターン文字列が’abc%’のような前方一致となる値を指定すると,’abc’から始まる値をサーチするだけで条件を評価できると判断し,実行時にキー条件を評価しなくなります。
このようにパターン文字列の値によって,削除できるようになるキー条件を< >で囲んで表示します。
- 例) where T1.C1 like ?
-
?パラメタの値が’abc%’(C1のデータ型:CHAR(5))
- [説明]
-
-
?が’abc%’の場合:
X’6162630000’〜X’616263ffff’の範囲を検索します(キー条件は削除されます)。
-
?が’abc%d’の場合:
X’6162630000’〜X’616263ffff’の範囲を検索し,キー条件でT1.C1 like ’abc%d’を評価します。
-
?が’%abc’の場合:
インデクスの全範囲をサーチし,キー条件でT1.C1 like ’%abc’を評価します(サーチ条件だけ削除されます。サーチ条件については,「サーチ条件」を参照してください)。
-
?(1)の番号は,?番号を表します。?番号については「キー条件に使用する値」を参照してください。
-
(2) キー条件に含まれる述語
キー条件に含まれる述語の形式を示します。限定述語,EXISTS述語はキー条件にはなりません。
ここで説明するキー条件の例は,インデクスの定義方法によっては,より高速に検索をするためサーチ条件にする場合があります。
(a) NULL述語
- 値 is null:
-
インデクスのキー値がNULLかどうかを評価します。
例) where T1.C1 is null → KeyCnd:T1.C1 is null
- 値 is not null:
-
インデクスのキー値がNULL以外かどうかを評価します。
例) where T1.C1 is not null → KeyCnd:T1.C1 is not null
(b) IN述語
- 値 in (値,値,…,値):
-
インデクスのキー値が値に含まれるかどうかを評価します。
例) where T1.C1 in ('a','b','c') → KeyCnd:T1.C1 in ('a','b','c')
- 値 not in (値,値,…,値):
-
インデクスのキー値が値に含まれないかを評価します。
例) where T1.C1 not in ('a','b','c') → KeyCnd:T1.C1 not in ('a','b','c')
(c) LIKE述語
- 値 like パターン文字列 [escape エスケープ文字]:
-
インデクスのキー値がパターンと一致するかどうかを評価します。
例) where T1.C1 like '%a' → KeyCnd:T1.C1 like '%a'
- 値 not like パターン文字列 [escape エスケープ文字]:
-
インデクスのキー値がパターンと一致しないかを評価します。
例) where T1.C1 not like '%a\_' escape '\' → KeyCnd:T1.C1 not like '%a\_' escape '\'
(d) XLIKE述語
- 値 xlike パターン文字列 [escape エスケープ文字]:
-
インデクスのキー値が大文字,小文字を区別しないでパターンと一致するかどうかを評価します。
例) where T1.C1 xlike '%a' → KeyCnd:T1.C1 xlike '%a'
- 値 not xlike パターン文字列 [escape エスケープ文字]:
-
インデクスのキー値が大文字,小文字を区別しないでパターンと一致しないかを評価します。
例) where T1.C1 not xlike '%a\_' escape '\' → KeyCnd:T1.C1 not xlike '%a\_' escape '\'
(e) BETWEEN述語
- 値 between 値1 and 値2:
-
インデクスのキー値が値1以上で,値2以下の範囲に含まれるかどうかを評価します。なお,not between は比較述語(<,>)とORの組み合わせに変換して評価します。
例1) where T1.C1 >= 'a' and T1.C1 <= 'z' → KeyCnd:T1.C1 between 'a' and 'z' 例2) where T1.C1 not between 'a' and 'z' → KeyCnd:T1.C1<'a' OR T1.C1>'z'
(f) 比較述語
- 値{=,<,<=,>,>=,<>}値:
-
インデクスのキー値が比較述語(=,<,<=,>,>=,<>)を満たすかどうかを評価します。
例1) where T1.C1=T1.C2 → KeyCnd:T1.C1=T1.C2 例2) where T1.C1=(select C1 from T2) → KeyCnd:T1.C1=SUBQ(2)
(g) 構造化繰返し述語
- array(…)[any](キー条件):
-
構造化繰返し述語の探索条件の中で,サーチ条件で評価できる条件を取り除いてからキー条件で評価する条件を表示します。
例) where array(T1.C1,T1.C2)[any] (T1.C1<'a' or (T1.C1>'z' and T2.C2='a')) → KeyCnd:array(...)[any] (T1.C1<'a' or (T1.C1>'z' and T2.C2='a'))
(h) SIMILAR述語
- 値 similar to パターン文字列 [escape エスケープ文字]:
-
インデクスのキー値がパターンと一致するかどうかを評価します。
例) where T1.C1 similar to '%a' → KeyCnd:T1.C1 similar to '%a'
- 値 not similar toパターン文字列 [escape エスケープ文字]:
-
インデクスのキー値がパターンと一致しないかを評価します。
例) where T1.C1 not similar to '%a\_' escape '\' → KeyCnd:T1.C1 not similar to '%a\_' escape '\'
(3) キー条件に使用する値
(a) 表名.列名
キー条件に列名を指定した場合に表示します。
表名が相関名の場合には,表名の代わりに相関名を( )で囲んで表示します。
(b) (NEW ROW).列名
制約判定のためにHiRDBが内部的に生成する副問合せ中で,外部キーへの挿入値,又は更新値を使用して絞り込む場合に表示します。
(c) 表名.列名[添字]
キー条件に繰返し列(添字は整数,又はANY)を指定した場合に表示します。
表名が相関名の場合には,表名の代わりに相関名を( )で囲んで表示します。
(d) 定数
キー条件に定数を指定した場合に値を表示します。定数の表示形式については,マニュアル「HiRDB SQLリファレンス」を参照してください。
(e) ?(?番号)
キー条件に埋込み変数,又は?パラメタを指定した場合に表示します。?番号とは,SQL文中にある埋込み変数,又は?パラメタに対して,1を開始値として左から出現順に番号を付けたものです。
(f) SQL変数名
キー条件にSQL変数を指定した場合に表示します。
(g) SQLパラメタ名
キー条件にSQLパラメタを指定した場合に表示します。
トリガSQL文中で新値相関名の列,及び旧値相関名の列を使用している場合,新値相関名の列は「(NEWROW).列名」,旧値相関名の列は「(OLDROW).列名」と表示します。
(h) USER
キー条件にUSER値関数を指定した場合に表示します。
(i) CURRENT_DATE
キー条件にCURRENT_DATE値関数を指定した場合に表示します。
(j) CURRENT_TIME
キー条件にCURRENT_TIME値関数を指定した場合に表示します。
(k) CURRENT_TIMESTAMP(p)
キー条件にCURRENT_TIMESTAMP値関数を指定した場合に表示します(p=0,2,4,又は6)。
(l) (SUBQ(問合せID))
キー条件に集合演算を含まないスカラ副問合せ,又は行副問合せを指定した場合に表示します。( )の中には問合せIDを表示します。
(m) SUBQEX(問合せ式本体ID)
キー条件に集合演算を含むスカラ副問合せ,又は行副問合せを指定した場合に表示します。( )の中には問合せIDを表示します。
(n) スカラ演算
キー条件にスカラ演算を指定した場合に表示します。
(o) 行値構成子
キー条件に行値構成子を指定した場合に表示します。