(a) 機能
XML型列の,値の特定の部分構造をキーとするインデクスを定義します。
(b) 使用権限
- 表の所有者
- 公用RDエリアに,自分が所有する表のインデクスを定義できます。
- 私用RDエリアの利用権限を持つ表の所有者
- 利用権限を持つ私用RDエリアに,自分が所有する表のインデクスを定義できます。
(c) 形式<部分構造インデクスの定義>
CREATE 〔UNIQUE〕 INDEX 〔認可識別子.〕インデクス識別子
ON 〔認可識別子.〕表識別子(列名〔{ASC|DESC}〕)
〔IN{RDエリア名
|(RDエリア名)
|((RDエリア名)〔,(RDエリア名)〕…)
|マトリクス分割インデクス格納用RDエリア指定}〕
KEY 〔 USING UNIQUE TAG 〕FROM 部分構造指定 AS データ型
〔インデクスオプション〕…
マトリクス分割インデクス格納用RDエリア指定 ::= 2次元格納用RDエリア指定
2次元格納用RDエリア指定::=
(マトリクス分割用RDエリアリスト〔,マトリクス分割用RDエリアリスト〕…)
マトリクス分割用RDエリアリスト ::= (RDエリア名〔,RDエリア名〕…)
部分構造指定 ::= 文字列定数
インデクスオプション ::={PCTFREE=未使用領域の比率
|UNBALANCED SPLIT
|EMPTY} |
(d) オペランド
KEY句以外のオペランド及びオペランド規則については「3. CREATE INDEX 形式1(インデクス定義)」を参照してください。
- KEY 〔USING UNIQUE TAG〕 FROM 部分構造指定 AS データ型
- USING UNIQUE TAG
- 一つのXML型列の値の中で,部分構造指定に該当する部分構造が一意に決まる場合に指定します。ただし,部分構造指定に該当する部分構造がXML属性の場合は,そのXML属性を持つXML要素が一意に決まる必要があります。
- CREATEの直後のUNIQUEオペランドを指定した場合は,この指定が仮定されます。
- 部分構造指定 ::= 文字列定数
- キーとする部分構造を表す文字列定数を,部分構造パスの形式の値で指定します。
- 部分構造パスの形式を次に示します。なお部分構造パス中のキーワードは,すべて小文字で指定します。
部分構造パス ::= 〔XML名前空間宣言〕… 部分構造パス式
XML名前空間宣言 ::= { declare namespace 接頭辞 = XML名前空間URI;
| declare default element namespace XML名前空間URI;}
部分構造パス式 ::= /ステップ式〔/ステップ式〕…
ステップ式 ::= 〔 @ 〕 修飾名
修飾名 ::= 〔接頭辞:〕局所名 |
- (凡例)
- ○:等価であるため,そのままキー値になります。
- △:型付き値プロパティの値を文字列として見た場合に,SQLのデータ型に対応した文字列表現であれば,変換されキー値になります。この場合,インデクスが定義されていない場合と結果が異なるおそれがあります。それ以外は変換できません。
- ×:変換できません。
(e) 共通規則
- インデクスは,一つの表に最大255個定義できます。
- インデクスは,ナル値を含む列,指定した部分構造がないXML型の値を含む列,又は行のない列に対しても定義できます。
- 部分構造インデクスはXML型の列に対してだけ指定できます。
- キー値の長さは,以下の計算式を満たすようにしてください。
キー値の長さ≦
MIN((インデクス格納用RDエリアのページサイズ÷2)-1242,4036)
各キー値の長さを次の表に示します。
表1-44 キー値の長さ
データ型 | キー値の長さ |
---|
INTEGER | 4 |
DECIMAL〔(m〔,n〕)〕 | ↓m÷2↓+ 1 |
FLOAT | 8 |
VARCHAR | 実際のデータ長が255バイト以下 | n1+1 |
実際のデータ長が256バイト以上 | n1+2 |
- (凡例)
- m,n:正の整数
- n1:実際のデータ長
- 同じ列の同じ部分構造をキーとするインデクスは,一つだけ定義できます。
- インデクスを定義した部分構造をXQuery中で評価する場合は,「AS データ型」で指定したSQLのデータ型に対応するXQueryデータ型の値として評価します。各SQLのデータ型に対応するXQueryデータ型を次の表に示します。
表1-45 XQueryを評価する時のXQueryデータ型
SQLのデータ型 | XQueryデータ型 |
---|
INTEGER | xs:int |
DECIMAL | xs:decimal |
FLOAT | xs:double |
VARCHAR | xs:string |
インデクスを定義した部分構造に対応する,XQueryデータモデルのノードの型付き値プロパティのXQueryデータ型がxs:untypedAtomic型であった場合,その部分構造に対してインデクスを定義した場合と,定義していない場合とで,XQuery中で評価するXQueryデータ型が異なります。このため,インデクスを削除すると,結果が異なる場合があります。
- インデクスを定義しようとしている表に対して手続き及びトリガが定義されている場合,そのSQLオブジェクト中のインデクス情報は無効になります。この場合,トリガは実行できなくなります。また,手続きからこの手続き又はトリガは実行できなくなるため,SQLオブジェクトを再作成する必要があります。
- 同一のインデクスオプションは,繰り返して指定できません。
- 実行中のSQLオブジェクト中のインデクス情報が無効になる場合,Java手続き中からCREATE INDEXは実行できません。
- インデクスを格納するRDエリアに,インナレプリカ機能を適用しているRDエリアと適用していないRDエリアは混在して指定できません。インナレプリカ機能を適用しているRDエリアを指定する場合,RDエリア名にはオリジナルRDエリア名を指定します。
- インナレプリカ機能を使用している場合のCREATE INDEXの実行条件については,マニュアル「インナレプリカ機能 HiRDB Staticizer Option Version 8」を参照してください。
- 一つのRDエリアに格納できるインデクスは,最大500個です。
(f) 留意事項
- インデクスが付いている列の値をユーザが更新すると,インデクスも更新されます。
- CREATE INDEXは,OLTP下のX/Openに従ったUAPからは指定できません。
- EMPTYを指定してインデクスを定義した場合,データベース再編成ユティリティでインデクスを再作成する必要があります。インデクスの再作成については,マニュアル「HiRDB Version 8 コマンドリファレンス」を参照してください。
- 大量のデータが登録されている表に対してCREATE INDEX文でインデクスを作成する場合,処理時間が長くなるおそれがあります。CREATE INDEX文を実行する前に,タイマ監視に関する指定を次のように設定してください。
- システム定義pd_watch_time
0を指定するか,指定を省略してください。
- クライアント環境定義PDCWAITTIME
実績やデータ量からCREATE INDEXの実行時間を推測できる場合は,0以外の余裕を持たせた値を指定してください。
実行時間を推測できない場合は,0又は指定を省略してください。
- HiRDB/パラレルサーバでサーバ間横分割した表にインデクスを定義する場合で,表格納用RDエリア,又は指定したインデクス格納用RDエリアが閉塞状態のときは,RDエリアの排他待ちとなります。このとき,排他待ちの時間がシステム定義pd_lck_wait_timeoutオペランドの指定値に達してタイムアウトしても,すぐにエラーリターンされないことがあります。これを避けるため,CREATE INDEX文を実行する前に,表格納用RDエリア,又は指定したインデクス格納用RDエリアの閉塞状態を解除してください。
(g) 使用例
- 書籍管理表の書籍情報列に対して,「書籍情報」XML要素の子の「カテゴリ」XML要素の値をVARCHAR型に変換した値をキー値とするインデクス(INDX1)を定義します。
CREATE INDEX INDX1 ON 書籍管理表(書籍情報)
KEY FROM '/書籍情報/カテゴリ' AS VARCHAR(100)
- 書籍管理表の書籍情報列に対して,「書籍情報」XML要素の子の「価格」XML要素の値をINTEGER型に変換した値をキー値とするインデクス(INDX2)を定義します。ただし,各行の値に「書籍情報」XML要素の子の「価格」XML要素が一意に決まる必要があります。
CREATE INDEX INDX2 ON 書籍管理表(書籍情報)
KEY USING UNIQUE TAG FROM '/書籍情報/価格' AS INTEGER
- 書籍管理表の書籍情報列に対して,「書籍情報」XML要素の「書籍ID」XML属性の値をINTEGER型に変換した値をキー値とするインデクス(INDX3)を定義します。ただし,「書籍情報」XML要素は,各行の値中でに一意に決まり,かつキー値はすべての行で異なっている必要があります。
CREATE UNIQUE INDEX INDX3 ON 書籍管理表(書籍情報)
KEY FROM '/書籍情報/@書籍ID' AS INTEGER