Hitachi

ノンストップデータベース HiRDB Version 10 SQLリファレンス


1.14.6 XML型用定義系SQL

〈この項の構成〉

(1) CREATE INDEX 形式3 (部分構造インデクス定義)

(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句以外のオペランド及びオペランド規則については「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;}
 
  部分構造パス式 ::= /ステップ式〔/ステップ式〕…
  ステップ式 ::= 〔 @ 〕 修飾名 
  修飾名 ::= 〔接頭辞:〕局所名 
  • declare namespace 接頭辞 = XML名前空間URI;

    部分構造パス式中に接頭辞付きの修飾名を含む場合,その修飾名の接頭辞のXML名前空間を宣言します。同じ接頭辞のXML名前空間は複数宣言できません。

    接頭辞

    部分構造パス式中の修飾名の接頭辞を指定します。

    大文字小文字を区別します。

    XML名前空間URI

    接頭辞に関連付けるXML名前空間のURIを引用符(”)又はアポストロフィ(’)で囲んで指定します。

    大文字小文字を区別します。

  • declare default element namespace XML名前空間URI;

    部分構造パス式の既定のXML名前空間を宣言します。部分構造パス式中の接頭辞のない修飾名のXML名前空間は,ここで宣言したXML名前空間となります。

    部分構造パス中には,既定のXML名前空間を複数宣言できません。

    この指定を省略した場合,既定のXML名前空間のXML名前空間URIは,’ http://www.w3.org/XML/1998/namespace’を仮定します。

    XML名前空間URI

    接頭辞を省略した修飾名に対するXML名前空間のURIを引用符(”)又はアポストロフィ(’)で囲んで指定します。

    大文字小文字を区別します。

  • 部分構造パス式

    キーとする部分構造を表すパスを指定します。

    各指定項目の意味を次の表に示します。

    指定項目

    意味

    先頭の斜線(/)

    斜線の後のステップ式が示す要素が,XML型の値の中の最上位のXML要素であることを意味します。

    途中の斜線(/)

    斜線の後のステップ式が示すXML要素又はXML属性が,斜線の前のステップ式が示すXML要素の,子のXML要素又はXML属性であることを意味します。

    ステップ式

    XML要素又はXML属性を意味します。

    ただし,XML属性を意味するステップ式は最後にだけ指定できます。

    @

    @の後の修飾名がXML属性の名前であることを意味します。

    @がない場合は,修飾名はXML要素の名前となります。

    修飾名

    XML要素又はXML属性の名前を意味します。

    接頭辞:

    後に続く局所名が,接頭辞が示すXML名前空間中の局所名であることを意味します。XML名前空間宣言でXML名前空間に対して割り当てた接頭辞を指定します。

    「接頭辞:」を省略した場合は,局所名は既定のXML名前空間中の名前となります。

    局所名

    XML名前空間中でのXML要素又はXML属性の名前を意味します。

    部分構造指定の指定例を次の表に示します。

    項番

    指定例

    意味

    1

    ‘/書籍情報/カテゴリ’

    最上位のXML要素である「書籍情報」の子のXML要素「カテゴリ」をキーとします。

    2

    ‘/書籍情報/@書籍ID’

    最上位のXML要素である「書籍情報」の属性「書籍ID」をキーとします。

    3

    ‘declare namespace

    b=”http://www.foo.co.jp/bookinfo”;

    /b:書籍情報/b:カテゴリ’

    最上位のXML要素である「書籍情報」の子のXML要素「カテゴリ」をキーとします。ただし,「書籍情報」及び「カテゴリ」のXML要素の名前はのXML名前空間URIが”http://www.foo.co.jp/bookinfo”であるXML名前空間中の名前となります。

    4

    ‘declare default element namespace ”http://www.foo.co.jp/bookinfo”;

    /書籍情報/カテゴリ’

    項番3と同じ意味となります。

    データ型

    キー値のデータ型を指定します。

    指定できるデータ型を次に示します。

    ・INTEGER

    ・DECIMAL

    ・FLOAT

    ・VARCHAR(文字集合指定は指定できません)

    キー値は,キーとする部分構造に対応するXQueryデータモデルでのノードの型付き値プロパティの値を,ここで指定したSQLのデータ型に変換した値になります。

    インデクス定義時に,既に列に格納されている値のキーとする部分構造の値が指定したSQLのデータ型に変換できない場合は,インデクスは定義できません。また,インデクスを定義した列に対する値の挿入又は値の更新時に,その挿入値又は更新値のキーとする部分構造の値が指定したSQLのデータ型に変換できない場合は,挿入又は更新ができません。

    各ノードが持つ型付き値プロパティの値については,「XQueryデータモデル」を参照してください。型付き値プロパティの値のXQueryデータ型とSQLのデータ型の対応関係を,次の表に示します。

表1‒41  XQueryデータ型とSQLのデータ型の対応関係

部分構造に対応するXQueryデータモデルのノードの型付き値プロパティのXQueryデータ型

SQLのデータ型

INTEGER

DECIMAL

FLOAT

VARCHAR

xs:untypedAtomic

xs:int

×

×

×

xs:decimal

×

×

×

xs:double

×

×

×

xs:string

×

×

×

その他

×

×

×

×

(凡例)

○:等価であるため,そのままキー値になります。

△:型付き値プロパティの値を文字列として見た場合に,SQLのデータ型に対応した文字列表現であれば,変換されキー値になります。この場合,インデクスが定義されていない場合と結果が異なるおそれがあります。それ以外は変換できません。

×:変換できません。

(e) 共通規則

  1. インデクスは,一つの表に最大255個定義できます。

  2. インデクスは,ナル値を含む列,指定した部分構造がないXML型の値を含む列,又は行のない列に対しても定義できます。

  3. 部分構造インデクスはXML型の列に対してだけ指定できます。

  4. キー値の長さは,以下の計算式を満たすようにしてください。

     キー値の長さ≦

       MIN((インデクス格納用RDエリアのページサイズ÷2)−1242,4036)

    各キー値の長さを次の表に示します。

    表1‒42  キー値の長さ

    データ型

    キー値の長さ

    INTEGER

    4

    DECIMAL〔(m〔,n〕)〕

    ↓m÷2↓+ 1

    FLOAT

    8

    VARCHAR

    実際のデータ長が255バイト以下

    n1+1

    実際のデータ長が256バイト以上

    n1+2

    (凡例)

    m,n:正の整数

    n1:実際のデータ長

  5. 同じ列の同じ部分構造をキーとするインデクスは,一つだけ定義できます。

  6. インデクスを定義した部分構造をXQuery中で評価する場合は,「AS データ型」で指定したSQLのデータ型に対応するXQueryデータ型の値として評価します。各SQLのデータ型に対応するXQueryデータ型を次の表に示します。

    表1‒43  XQueryを評価する時のXQueryデータ型

    SQLのデータ型

    XQueryデータ型

    INTEGER

    xs:int

    DECIMAL

    xs:decimal

    FLOAT

    xs:double

    VARCHAR

    xs:string

    インデクスを定義した部分構造に対応する,XQueryデータモデルのノードの型付き値プロパティのXQueryデータ型がxs:untypedAtomic型であった場合,その部分構造に対してインデクスを定義した場合と,定義していない場合とで,XQuery中で評価するXQueryデータ型が異なります。このため,インデクスを削除すると,結果が異なる場合があります。

  7. インデクスを定義しようとしている表に対して手続き及びトリガが定義されている場合,そのSQLオブジェクト中のインデクス情報は無効になります。この場合,トリガは実行できなくなります。また,手続きからこの手続き又はトリガは実行できなくなるため,SQLオブジェクトを再作成する必要があります。

  8. 同一のインデクスオプションは,繰り返して指定できません。

  9. 実行中のSQLオブジェクト中のインデクス情報が無効になる場合,Java手続き中からCREATE INDEXは実行できません。

  10. インデクスを格納するRDエリアに,インナレプリカ機能を適用しているRDエリアと適用していないRDエリアは混在して指定できません。インナレプリカ機能を適用しているRDエリアを指定する場合,RDエリア名にはオリジナルRDエリア名を指定します。

  11. インナレプリカ機能を使用している場合のCREATE INDEXの実行条件については,マニュアル「インナレプリカ機能 HiRDB Staticizer Option」を参照してください。

  12. 一つのRDエリアに格納できるインデクスは,最大500個です。

  13. インデクスを格納するRDエリアに一時表用RDエリアは指定できません。

(f) 留意事項

  1. インデクスが付いている列の値をユーザが更新すると,インデクスも更新されます。

  2. CREATE INDEXは,OLTP下のX/Openに従ったUAPからは指定できません。

  3. EMPTYを指定してインデクスを定義した場合,データベース再編成ユティリティでインデクスを再作成する必要があります。インデクスの再作成については,マニュアル「HiRDB コマンドリファレンス」を参照してください。

  4. 大量のデータが登録されている表に対してCREATE INDEX文でインデクスを作成する場合,処理時間が長くなるおそれがあります。CREATE INDEX文を実行する前に,タイマ監視に関する指定を次のように設定してください。

    • クライアント環境定義PDCWAITTIME

      実績やデータ量からCREATE INDEXの実行時間を推測できる場合は,0以外の余裕を持たせた値を指定してください。

      実行時間を推測できない場合は,0又は指定を省略してください。

  5. HiRDB/パラレルサーバでサーバ間横分割した表にインデクスを定義する場合で,表格納用RDエリア,又は指定したインデクス格納用RDエリアが閉塞状態のときは,RDエリアの排他待ちとなります。このとき,排他待ちの時間がシステム定義pd_lck_wait_timeoutオペランドの指定値に達してタイムアウトしても,すぐにエラーリターンされないことがあります。これを避けるため,CREATE INDEX文を実行する前に,表格納用RDエリア,又は指定したインデクス格納用RDエリアの閉塞状態を解除してください。

(g) 使用例

  1. 書籍管理表の書籍情報列に対して,「書籍情報」XML要素の子の「カテゴリ」XML要素の値をVARCHAR型に変換した値をキー値とするインデクス(INDX1)を定義します。

      CREATE INDEX INDX1 ON 書籍管理表(書籍情報)
        KEY FROM ‘/書籍情報/カテゴリ’ AS VARCHAR(100)
  2. 書籍管理表の書籍情報列に対して,「書籍情報」XML要素の子の「価格」XML要素の値をINTEGER型に変換した値をキー値とするインデクス(INDX2)を定義します。ただし,各行の値に「書籍情報」XML要素の子の「価格」XML要素が一意に決まる必要があります。

      CREATE INDEX INDX2 ON 書籍管理表(書籍情報)
        KEY USING UNIQUE TAG FROM ‘/書籍情報/価格’ AS INTEGER
  3. 書籍管理表の書籍情報列に対して,「書籍情報」XML要素の「書籍ID」XML属性の値をINTEGER型に変換した値をキー値とするインデクス(INDX3)を定義します。ただし,「書籍情報」XML要素は,各行の値中でに一意に決まり,かつキー値はすべての行で異なっている必要があります。

      CREATE UNIQUE INDEX INDX3 ON 書籍管理表(書籍情報)
        KEY FROM ‘/書籍情報/@書籍ID’ AS INTEGER