スケーラブルデータベースサーバ HiRDB Version 8 コマンドリファレンス(Windows(R)用)

[目次][索引][前へ][次へ]

17.5.13 キー条件

<この項の構成>
(1) キー条件の概要
(2) キー条件に含まれる述語
(3) キー条件に使用する値

(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’を評価します(サーチ条件だけ削除されます。サーチ条件については,「17.5.12 サーチ条件」を参照してください)。
  • ?(1)の番号は,?番号を表します。?番号については「(3) キー条件に使用する値」を参照してください。

(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 Version 8 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) 行値構成子

キー条件に行値構成子を指定した場合に表示します。