Hitachi

ノンストップデータベース HiRDB Version 9 システム導入・設計ガイド(Windows(R)用)


6.4.2 XML型

ここでは,HiRDB XML Extensionが提供する抽象データ型(XML型)を定義した表の作成方法について説明します。

ここでは,書籍管理表を作成します。書籍管理表の作成条件を次に示します。

〈この項の構成〉

(1) 書籍管理表の定義

CREATE TABLEで書籍管理表を定義します。定義例を次に示します。

XML型の列を含む表の定義例
CREATE TABLE 書籍管理表 (書籍ID INTEGER, 書籍情報 XML) IN RDAREA01

(2) インデクスの定義

(a) 部分構造インデクス(B-tree)

XML型の列には,特定の部分構造をキーとし,その値をキー値としたインデクスを定義できます。このインデクスを利用すると,XMLEXISTS述語やXMLQUERY関数のXQuery式中に,部分構造インデクスを定義した構造に対する述語を指定した場合,行の絞り込みの処理時間を削減できることがあります。

部分構造インデクスを利用できるXQuery式中の述語を次に示します。

  • キーである部分構造に対する比較式(=,!=,>,>=,<,<=,<>,eq,ne,lt,le,gt,ge)

  • キーである部分構造に対するfn:contains関数,fn:starts-with関数,fn:ends-with関数

インデクスの使用条件については,「インデクスの使用条件」で説明します。

部分構造インデクスを使用した検索については,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(b) XML型全文検索用インデクス(n-gram)

XML型の列には,XML型の値に対する全文検索用のn-gramインデクス(IXXML)を定義できます。XML型全文検索用インデクスを定義することで,XMLEXISTS述語のXQuery式中で文字列一致などの全文検索条件を含む述語を記述した場合に,行の絞り込みの処理時間を削減できることがあります。

XML型全文検索の条件となるXQuery式中の述語を次に示します。

  • 文字列(xs:string型)同士の完全一致(=)

  • fn:contains関数

  • fn:starts-with関数

  • fn:ends-with関数

  • hi-fn:contains関数

インデクスの使用条件については,「インデクスの使用条件」で説明します。

XML型全文検索用インデクスを使用した検索については,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(3) 表へのデータの格納

表へデータを格納する場合の入力データには,次の二つがあります。入力データの種類によって,データの格納方法が異なります。

  1. XML文書をXML挿入データに変換したESIS-B形式

    この場合は,XML変換コマンド(phdxmlcnv)又はXML変換ライブラリ(Javaライブラリ)を使用してXML文書を解析し,XML挿入データ(ESIS-B形式といいます)を生成します。このESIS-B形式のデータをバイナリ形式にして出力し,pdload又はINSERT文を使用して表へ格納します。

    XML変換コマンド及びXML変換ライブラリについては,マニュアル「HiRDB XML Extension Version 9」を参照してください。

  2. XML文書

    この場合は,データベース作成ユティリティ(pdload)又はXMLPARSE関数を使用してXML文書をXML挿入データ(ESIS-B形式)に変換し,表へ格納します。XML文書からESIS-B形式への変換はpdload又はXMLPARSE関数の中で行われます。pdload内でESIS-B形式への変換を行う場合には,-Gオプションを指定します。

(a) データロード

データベース作成ユティリティ(pdload)で表にデータを格納する場合の手順を次に示します。

〈手順〉

  1. pdholdコマンドで,データロード対象RDエリア(RDAREA01,RDAREA02,LOBAREA01)を閉塞します。

  2. pdloadコマンドで,入力データファイルを表にデータロードします。

    • XML文書をそのまま入力データとする場合は-Gオプションを指定します。

    • RDエリアにはデータロード対象表(インデクス)だけを格納していて,かつ初期ロードのため,データベースの更新ログ取得方式にログレスモードを選択します。

    • インデクスの作成方法にインデクス一括作成モード(省略値)を選択します。

    • コンストラクタ関数やコンストラクタ関数に渡すデータ型の情報を列構成情報ファイルに指定します。

    • 入力データファイルの形式をバイナリ形式に設定します。

    pdloadコマンドに指定するオプションについては,マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。

  3. ログレスモードでpdloadコマンドを実行しているため,データロード対象RDエリアのバックアップを取得します。RDエリア単位のバックアップの取得方法については,マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。

  4. pdrelsコマンドで,データロード対象RDエリアの閉塞を解除します。

上記のコマンドとユティリティの詳細及びこれらのコマンドとユティリティの実行結果の確認方法については,マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。

補足事項
  • ログレスモードでpdloadコマンドを実行するため,前記の手順1〜3の間はデータロード対象RDエリアを閉塞したままにしてください。

  • 改竄防止表に対してpdloadコマンドでデータロードするとき,-dオプションは使用できません。

  • インデクス一括作成中にエラーが発生した場合の対処方法については,「インデクス一括作成中に発生したエラーの対処方法」を参照してください。

(b) XML文書の挿入

ESIS-B形式のデータを表へ挿入又は更新する場合

INSERT文の挿入値,又はUPDATE文の更新値にXMLコンストラクタ関数を指定し,その引数に生成したESIS-B形式のデータを設定します。

書籍管理表に埋込み変数bookinfoに格納されたXML文書(ESIS-B形式)の値を挿入する例を次に示します。

XML文書(ESIS-B形式)の挿入例
INSERT INTO 書籍管理表
  VALUES ( 310494321, XML(:bookinfo AS BINARY(102400)))
XML文書を表へ挿入又は更新する場合

INSERT文の挿入値,又はUPDATE文の更新値にXMLPARSE関数を指定し,その引数にXML文書を設定します。

書籍管理表に埋込み変数bookdocに格納されたXML文書の値を挿入する例を次に示します。

XML文書の挿入例
INSERT INTO 書籍管理表
  VALUES ( 310494321, XMLPARSE(DOCUMENT :bookdoc AS BINARY(32000)))

(4) インデクスの使用条件

ここでは,(2)で説明した二つのインデクスの使用条件について説明します。

部分構造インデクスの使用条件

部分構造インデクスを定義した場合,次の表に示す部分構造インデクスの使用条件を満たすと,インデクスが使用されます。

表6‒4 部分構造インデクスの使用条件

USING UNIQUE TAGの指定

XQuery指定箇所

XQuery中の演算子又は関数

部分構造インデクスの使用条件※1

あり

XMLEXISTS述語

=

(a)1,2,3※2,3

(b)1,2,5,6,7※2,8,9

!=,>,>=,<,<=,<>,eq,ne,gt,ge,lt,le,

fn:contains,

fn:starts-with,

fn:ends-with

(a)1,2,3※2,3

(b)1,2,4,6,7※2,8,9

XMLQUERY関数

=

(c)1,2,3

なし

XMLEXISTS述語

=

(a)1,2,3※2,3

(b)1,3,5,6,7※2,8,9,11※3

!=,>,>=,<,<=,<>

(a)1,2,3※2,3

(b)1,3,4,6,7※2,8,9,11※3

fn:contains

fn:starts-with

fn:ends-with

(a)1,2,3※2,3

(b)1,3,4,6,7※2,8,10,11※3

XMLQUERY関数

=

(c)1,2,3

注※1

(a)は,(a)で説明する部分構造インデクス及びXML型全文検索用インデクス共通の使用条件を示します。

(b)は,(b)で説明する部分構造インデクスの使用条件を示します。

(c)は,(c)で説明するXMLQUERY関数のXQueryに関する部分構造インデクスの使用条件を示します。

また,数字は(a),(b),及び(c)での項番に対応しています。

注※2

XMLEXISTS述語のXQuery問合せにXQuery論理式(OR)を指定する場合,インデクスが使用されます。

注※3

XMLEXISTS述語のXQuery問合せにXQuery論理式(AND)を指定する場合,インデクスが使用されます。

XML型全文検索用インデクスの使用条件

XML型全文検索用インデクスを定義した場合,次の表に示すXML型全文検索用インデクスの使用条件を満たすと,インデクスが使用されます。

表6‒5 XML型全文検索用インデクスの使用条件

XQuery指定箇所

XQuery中の演算子又は関数

XML型全文検索用インデクスの使用条件※1

XMLEXISTS述語

fn:contains

fn:starts-with

fn:ends-with

=

(a)1,2,3※2,3

(d)1,2,4,5,6,7,8

hi-fn:contains

(a)1,2,3※2,3

(d)1,3,4,5,6,7,8

注※1

(a)は,(a)で説明する部分構造インデクス及びXML型全文検索用インデクス共通の使用条件を示します。

(d)は,(d)で説明するXML型全文検索用インデクスの使用条件を示します。

また,数字は(a)及び(d)での項番に対応しています。

注※2

XMLEXISTS述語のXQuery問合せにXQuery論理式(OR)を指定する場合,インデクスが使用されます。

注※3

XMLEXISTS述語のXQuery問合せにXQuery論理式(AND)を指定する場合,インデクスが使用されます。

複数のインデクスを使用できる演算子又は関数の場合

部分構造インデクスとXML型全文検索用インデクスの両方を使用できるXQuery中の演算子又は関数を使用して検索を行う場合,評価に使用するインデクスは演算子又は関数によって決まります。演算子又は関数ごとに,どのインデクスが使用されるかを次の表に示します。

表6‒6 複数のインデクスが使用できる演算子又は関数の評価に使用するインデクス

項番

演算子又は関数

評価に使用するインデクス

1

=

部分構造インデクス

2

fn:contains

XML型全文検索用インデクス

3

fn:starts-with

部分構造インデクス

4

fn:ends-with

XML型全文検索用インデクス

使用するインデクスを指定したい場合は,使用インデクスのSQL最適化指定をします。詳細については,マニュアル「HiRDB Version 9 SQLリファレンス」の「使用インデクスのSQL最適化指定」を参照してください。

なお,HiRDBが見積もるアクセスコストによっては,これらのインデクスを使用しないことがあります。インデクスを使用した検索が行われたかどうかについては,アクセスパス表示ユティリティ(pdvwopt)で確認してください。

また,XMLEXISTS述語のXQuery問合せ中に指定した,部分構造インデクス,又はXML型全文検索インデクスを使用できる述語については,最大で255個しかインデクスを用いて評価しません。

(a) 部分構造インデクス及びXML型全文検索用インデクス共通の使用条件

部分構造インデクス及びXML型全文検索用インデクス共通の使用条件を次に示します。

なお,次のように定義したインデクスを例文中で使用します。

create index idx1 on t1(c1) key using unique tag from '/root/elm1/@attr1' as varchar(10)
  1. XMLEXISTS述語のXML問合せ引数にXML問合せ文脈項目を指定している。

    (例)

    select c2 from t1
      where xmlexists('/root/elm1[@attr1 eq "ABC"]'
            passing by value c1,'DEF' as A)

    注 アンダーライン部分がXML問合せ文脈項目です。

  2. XMLEXISTS述語のXQuery問合せ中に指定した文脈項目式(ピリオド)をすべてXQuery述語中に指定している。

    (例)

    select c2 from t1 
      where xmlexists('/root/elm1[./@attr1 eq "ABC"]' passing by value c1)

    注 アンダーライン部分がXQuery述語中に指定した文脈項目式です。

  3. XMLEXISTS述語のXQuery問合せ中のXQuery論理式(AND,OR)をすべてXQuery述語中に指定している。

    (例)

    select c2 from t1
      where xmlexists('/root[elm1/@attr1 = "ABC" or elm1/@attr1 = "DEF"]'
            passing by value c1)

    注 アンダーライン部分がXQuery述語中に指定したXQuery論理式です(OR)。

(b) XMLEXISTS述語のXQueryに関する部分構造インデクスの使用条件

XMLEXISTS述語のXQueryに関する部分構造インデクスの使用条件を次に示します。

なお,1.,2.,4.〜9.では,次のように定義したインデクスを例文中で使用します。

 create index idx1 on t1(c1) key using unique tag from '/root/elm1/@attr1' as varchar(10)
 create index idx4 on t1(c1) key using unique tag from '/root/elm1/elm2' as varchar(10)

3.,10.,11.では,次のように定義したインデクスを例文中で使用します。

 create index idx2 on t1(c1) key from '/root/elm1/@attr1' as varchar(10)
 create index idx5 on t1(c1) key from '/root/elm1/elm2' as varchar(10)
  1. インデクスの部分構造指定と,XMLEXISTS述語のXQuery問合せ中で条件として指定した部分構造パスが一致する。

    (例)

    select c2 from t1
      where xmlexists('/root/elm1[@attr1 eq "ABC"]' passing by value c1)

    注 アンダーライン部分が一致する部分構造パスです。

  2. USING UNIQUE TAGの指定がある部分構造インデクスの場合,汎用比較,値比較,fn:contains関数,fn:starts-with関数,又はfn:ends-with関数を使用して,XMLEXISTS述語のXQuery問合せ中で条件として指定した部分構造パスを比較する。

    (例)

    select c2 from t1
      where xmlexists('/root/elm1[@attr1 eq "ABC"]' passing by value c1)

    注 アンダーライン部分がXQuery比較式です(値比較)。

  3. USING UNIQUE TAGの指定がない部分構造インデクスの場合,汎用比較,fn:contains関数,fn:starts-with関数,又はfn:ends-with関数を使用して,XMLEXISTS述語のXQuery問合せ中で条件として指定した部分構造パスを比較する。

    (例)

    select c2 from t1
      where xmlexists('/root/elm1[@attr1 = "ABC"]' passing by value c1)

    注 アンダーライン部分がXQuery比較式です(汎用比較)。

  4. 汎用比較又は値比較と,fn:contains関数,fn:starts-with関数,又はfn:ends-with関数の場合に分けて説明します。

    <汎用比較,又は値比較の場合>

    汎用比較,又は値比較で比較する対象は,XMLEXISTS述語のXQuery問合せ中で条件として指定した部分構造パスと,一つのXQuery定数又はXQuery変数である。

    (例)

    select c2 from t1
      where xmlexists('/root/elm1[@attr1 >= "ABC"]' passing by value c1)

    注 アンダーライン部分が部分構造パスとXQuery定数の比較です。

    <fn:contains関数,fn:starts-with関数,又はfn:ends-with関数の場合>

    fn:contains関数,fn:starts-with関数,又はfn:ends-with関数の第1引数がXMLEXISTS述語のXQuery問合せ中で条件として指定した部分構造パスで,かつ第2引数が一つのXQuery定数又はXQuery変数である。

    (例)

    select c2 from t1
      where xmlexists('/root/elm1[fn:starts-with(@attr1,"ABC")]' passing by value c1)

    注 アンダーライン部分が部分構造パスとXQuery定数の比較です。

  5. =で比較する対象は,XMLEXISTS述語のXQuery問合せ中で条件として指定した部分構造パスと,システム共通定義pd_apply_search_ats_numオペランドの指定値以下のXQuery定数又はXQuery変数から成るXQueryシーケンス連結式である。

    (例)

    select c2 from t1
      where xmlexists('/root/elm1[@attr1 = ("ABC","DEF","GHI")]'
            passing by value c1)

    注 アンダーライン部分がシステム共通定義pd_apply_search_ats_numオペランドの指定値以下のXQuery定数から成るXQueryシーケンス連結式です。

  6. 部分構造インデクス定義時に指定したキー値のデータ型が,XMLEXISTS述語のXQuery問合せ中で条件として指定した部分構造パスと比較するXQuery定数若しくはXQuery問合せ中のXQuery変数に渡す値式のデータ型と同じ,又は変換可能である。

    (例)

    select c2 from t1
      where xmlexists('/root/elm1[@attr1 = "ABC"]' passing by value c1)

    注 アンダーライン部分が,キー値のデータ型であるVARCHAR型と同じstring型データです。

  7. XMLEXISTS述語のXQuery問合せに指定したXQuery論理式(OR)オペランドに部分構造インデクスを使用できる条件だけを含む。

    (例)

    select c2 from t1
      where xmlexists('/root[elm1/@attr1 = "ABC" or elm1/@attr1 = "DEF"]' 
            passing by value c1)

    注 アンダーライン部分が,すべて部分構造インデクスを使用できる条件です。

  8. 4.又は5.で,条件として指定した部分構造パスと比較する値としてXQuery変数を指定した場合,そのXQuery変数に渡す値式が次のどれかである。

    • 定数

    • USER値関数

    • 値式が?パラメタ,SQLパラメタ,又はSQL変数のCAST指定

    • 外への参照なしスカラ副問合せ

    (例1)

    select c2 from t1
      where xmlexists('/root/elm1[@attr1 eq $A]'
            passing by value c1,'ABC' as A)

    注 アンダーライン部分がXQuery問合せ中のXQuery変数に渡す値式です(定数)。

    (例2)

    select c2 from t1
      where xmlexists('/root/elm1[@attr1 eq $A]'
            passing by value c1,cast(? as varchar(256)) as A)

    注 アンダーライン部分が,XQuery問合せ中のXQuery変数に渡す値式(値式が?パラメタ,SQLパラメタ,又はSQL変数のCAST指定)です。

  9. 値比較,又は汎用比較で比較する対象の部分構造パスが次の形式で指定されている。又は,USING UNIQUE TAGの指定がある部分構造インデクスの場合で,かつfn:contains関数,fn:starts-with関数,又はfn:ends-with関数の第1引数を含む部分構造パスが次の形式で指定されている。

    部分構造パス:: = 〔XML名前空間宣言〕…部分構造パス式
    XML名前空間宣言::={declare namespace 接頭辞 = XML名前空間URI;
                      | declare default element namespace XML名前空間URI;} 
    部分構造パス式:: = 〔/ステップ式…〕/ステップ式
    ステップ式:: = {〔{child:: | attribute:: | @ }〕 修飾名 | 文脈項目式}
    文脈項目式:: = ピリオド
    ピリオド::= .
    修飾名:: = 〔接頭辞:〕局所名

    <値比較又は汎用比較を使用した例>

    次の(例1)〜(例3)は,値比較又は汎用比較を使用した例です。これらの例で値比較演算子eqにほかの値比較又は汎用比較を指定した場合も,インデクスを使用します。なお,USING UNIQUE TAGの指定有無に関するインデクスの使用条件については,2.及び3.を参照してください。

    (例1)ステップ式に@又はattribute::と,修飾名を指定した場合(@とattribute::は同じ意味)

    select c2 from t1 
      where xmlexists('/root/child::elm1[@attr1 eq "ABC"]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    (例2)ステップ式にchild::を指定,又はchild::を省略し,修飾名を指定した場合

    select c2 from t1
      where xmlexists('/root/child::elm1[child::elm2 eq "ABC"]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    (例3)ステップ式に文脈項目式を指定した場合(値比較は使用条件2.に該当する場合だけ)

    select c2 from t1
      where xmlexists('/root/child::elm1/elm2[ . eq "ABC"]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    <XQuery関数を使用した例>

    次の(例4)〜(例6)は,XQuery関数を使用した例です。これらの例でfn:starts-with関数にほかのXQuery関数を指定した場合も,インデクスを使用します。

    (例4)ステップ式に@又はattribute::と,修飾名を指定した場合(@とattribute::は同じ意味)

    select c2 from t1
      where xmlexists('/root/elm1[fn:starts-with(@attr1 ,"ABC")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    (例5)ステップ式にchild::を指定,又はchild::を省略し,修飾名を指定した場合

    select c2 from t1
      where xmlexists('/root/elm1[fn:starts-with(elm2 ,"ABC")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    (例6)ステップ式に文脈項目式を指定した場合

    select c2 from t1
      where xmlexists('/root/elm1/@attr1[fn:starts-with( . ,"ABC")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

  10. USING UNIQUE TAGの指定がない部分構造インデクスの場合で,かつfn:contains関数,fn:starts-with関数,又はfn:ends-with関数の第1引数を含む部分構造パスが次の形式で指定されており,さらに第1引数が次のステップ式終端の形式で指定されている。

    部分構造パス:: = 〔XML名前空間宣言〕…部分構造パス式
    XML名前空間宣言::={declare namespace 接頭辞 = XML名前空間URI;
                      | declare default element namespace XML名前空間URI;} 
    部分構造パス式:: = 〔/ステップ式…〕/ステップ式終端
    ステップ式:: = {〔{child:: | attribute:: | @ }〕 修飾名 | 文脈項目式}
    ステップ式終端:: = {{attribute:: | @ } 修飾名 | 文脈項目式}
    文脈項目式:: = ピリオド
    ピリオド::= .
    修飾名:: = 〔接頭辞:〕局所名

    次に示す例でfn:starts-with関数にほかのXQuery関数を指定した場合も,インデクスを使用します。

    (例1)ステップ式終端に@又はattribute::と,修飾名を指定した場合(@とattribute::は同じ意味)

    select c2 from t1 
      where xmlexists('/root/elm1[fn:starts-with(@attr1 ,"ABC")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    (例2)ステップ式終端に文脈項目式を指定した場合

    select c2 from t1
      where xmlexists('/root/elm1/@attr1[fn:starts-with( . ,"ABC")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

  11. USING UNIQUE TAGの指定がない部分構造インデクスで,次のどちらかの条件を満たす。

    • XMLEXISTS述語のXQuery問合せのXQuery論理式(AND)オペランドに同じノードを複数回指定していない。

    • XMLEXISTS述語のXQuery問合せのXQuery論理式(AND)オペランドに同じノードを複数回指定しているが,汎用比較,又はfn:contains関数,fn:starts-with関数,若しくはfn:ends-with関数の第1引数で指定する同じノードが,次のステップ式終端の形式で指定されている。

     ステップ式終端 ::= {{attribute:: | @} 修飾名 | 文脈項目式}
     修飾名 ::= 〔接頭辞:〕局所名
     文脈項目式 ::= ピリオド
     ピリオド ::= .

    <部分構造インデクスを使用する例>

    • XMLEXISTS述語のXQuery問合せのXQuery論理式(AND)オペランドに同じノードを複数回指定していない場合の例

    (例1)

    select c2 from t1
      where xmlexists('/root/elm1[@attr1 >= "A01" and elm2 <= "A99"]'
            passing by value c1);

     注 アンダーライン部分が同じノードを複数回指定していない部分構造パスです。

    (例2)

    select c2 from t1
      where xmlexists('/root/elm1[fn:starts-with(@attr1 ,"A01") and elm2 = "A01"]'
            passing by value c1);

     注 アンダーライン部分が同じノードを複数回指定していない部分構造パスです。

    • XMLEXISTS述語のXQuery問合せのXQuery論理式(AND)オペランドに同じノードを複数回指定した場合の例

    (例3)汎用比較の比較項に@又はattribute::と,修飾名を指定した場合(@とattribute::は同じ意味)

    select c2 from t1
      where xmlexists('/root/elm1[@attr1 >= "A01" and @attr1 <= "A99"]'
            passing by value c1);

     注 アンダーライン部分が形式と一致する部分構造パスです。

    (例4)fn:contains関数,fn:starts-with関数,又はfn:ends-with関数の第1引数に@又はattribute::と,修飾名を指定した場合(@とattribute::は同じ意味)

    select c2 from t1
      where xmlexists('/root/elm1[fn:starts-with(@attr1 ,"A") and fn:ends-with(@attr1 ,"01")]'
            passing by value c1);

     注 アンダーライン部分が形式と一致する部分構造パスです。

    (例5)汎用比較の比較項に文脈項目式を指定した場合

    select c2 from t1
      where xmlexists('/root/elm1/elm2[. >= "A01" and . <= "A99"]'
            passing by value c1);

     注 アンダーライン部分が形式と一致する部分構造パスです。

    (例6)fn:contains関数,fn:starts-with関数,又はfn:ends-with関数の第1引数に文脈項目式を指定した場合

    select c2 from t1
      where xmlexists('/root/elm1/elm2 [fn:contains(. ,"A") and fn:contains(. ,"01")]'
            passing by value c1);

     注 アンダーライン部分が形式と一致する部分構造パスです。

    <部分構造インデクスを使用しない例>

    (例1)汎用比較の比較項の@attr1の前にelm1が指定されているため,形式と一致しない場合

    select c2 from t1
      where xmlexists('/root[elm1/@attr1 >= "A01" and elm1/@attr1 <= "A99"]'
            passing by value c1);

     注 アンダーライン部分が形式と一致しない部分構造パスです。

    (例2)fn:contains関数,fn:starts-with関数,又はfn:ends-with関数の第1引数の@attr1の前にelm1が指定されているため,形式と一致しない場合

    select c2 from t1
      where xmlexists('/root[fn:starts-with(elm1/@attr1 ,"A")
                     and fn:ends-with(elm1/@attr1 ,"01")]'
            passing by value c1);

     注 アンダーライン部分が形式と一致しない部分構造パスです。

    (例3)汎用比較の比較項に,属性又は文脈項目以外の同じノードが複数回指定されているため,形式と一致しない場合

    select c2 from t1
      where xmlexists('/root/elm1[elm2 >= "A01" and elm2 <= "A99"]'
            passing by value c1);

     注 アンダーライン部分が形式と一致しない部分構造パスです。

    (例4)fn:contains関数,fn:starts-with関数,又はfn:ends-with関数の第1引数に,属性又は文脈項目以外の同じノードが複数回指定されているため,形式と一致しない場合

    select c2 from t1
      where xmlexists('/root/elm1[fn:starts-with(elm2 ,"A") and fn:ends-with(elm2 ,"01")]'
            passing by value c1);

     注 アンダーライン部分が形式と一致しない部分構造パスです。

(c) XMLQUERY関数のXQueryに関する部分構造インデクスの使用条件

XMLQUERY関数のXQueryに関する部分構造インデクスの使用条件を次に示します。

なお,1.及び2.では,次のように定義したインデクスを例文中で使用します。

 create index idx1 on t1(c1) key using unique tag from '/root/elm1' as varchar(10)
  1. SQLが次のすべての条件を満たす。

    • SELECT文,又はINSERT〜SELECT文である

    • 主問合せの選択式が一つである

    • 上記の主問合せの選択式がXMLQUERYである(ただし,XMLSERIALIZEの引数がXMLQUERYでもよい)

    • 上記のXMLQUERYのXML問合せ引数がXML問合せ変数一つで,かつ変数に渡す値式はXMLAGGである

    • 上記のXML問合せ変数に指定したXMLAGGの引数は列指定単独である

    • 表の結合を指定していない

    • 集合演算を指定していない

    • 副問合せを指定していない

    • 集合関数を指定していない

    • GROUP BY句を指定していない

    • HAVING句を指定していない

    • WHERE句が指定されている場合,ANDの指定数が255以下である

    SQLの例については,2.の例を参照してください。

  2. XMLQUERY関数に指定したXQueryが次のすべての条件を満たす。

    a. XML問合せ変数をルートとするパス式である

    b. 最も外側のXQuery述語の指定が一つだけ存在する

    c. b.の述語で汎用比較'='による比較を行っている

    d. c.の比較が,XML列の特定の部分構造とXQuery変数をルートとするパス式の比較である

    (例)

    select xmlserialize(xmlquery('$VAR1/root[elm1 = $VAR1/root[elm2 = "ABC"]/elm1]/elm1'
      passing by value xmlagg(c1) as VAR1 empty on empty) as varchar(32000)) from t1

    注 アンダーライン部分が上記の条件と一致する箇所です。

  3. 2.のd.のXML列の特定の部分構造,及びXQuery変数をルートとするパス式に,同じデータ型の部分構造インデクスを定義している(これらのインデクスは同一のものでもかまいません)。

(d) XML型全文検索用インデクスの使用条件

XML型全文検索用インデクスの使用条件を次に示します。

  1. 検索対象のXML型の列に全文検索インデクスを定義している。

    (例)

    create index idx3 using type ixxml on t2(c1) in (LOB1)
  2. fn:contains関数,fn:starts-with関数,又はfn:ends-with関数の第1引数を含む部分構造パスが次の形式で指定されており,さらに第1引数が次のテキストステップ式終端,又は属性ステップ式終端の形式で指定されている。又は=で比較する対象の部分構造パスが次の形式で指定されており,XQuery述語中に指定した部分構造パスが次のテキストステップ式終端又は属性ステップ式終端の形式で指定されている。

    部分構造パス:: = 〔XML名前空間宣言〕… 部分構造パス式
    XML名前空間宣言:: = {declare default element namespace 
                       "http://www.w3.org/XML/1998/namespace";
                     |declare namespace 接頭辞 = XML名前空間URI;
                     |declare default element namespace XML名前空間URI;}
    部分構造パス式:: = 〔{/ | //}ステップ式 …〕
                         {/ | //}{テキストステップ式 | 属性ステップ式終端}
    ステップ式:: = {〔child::〕 名前テスト | 文脈項目式}
    テキストステップ式:: = 〔{child::|descendant::}〕テキストテスト
                              /テキストステップ式終端
    テキストステップ式終端:: = 文脈項目式
    属性ステップ式終端:: = {{attribute:: | @} 名前テスト
                       | 〔{attribute:: | @}〕 属性テスト}
    文脈項目式:: = ピリオド
    ピリオド:: = .
    名前テスト:: = {修飾名|*|接頭辞:*|*:局所名}
    修飾名:: = 〔接頭辞:〕局所名 

    注※ HiRDB XML Extensionのバージョンが08-04以降の場合に指定できます。

    次に示す例でfn:contains関数にほかのXQuery関数を指定した場合も,インデクスを使用します。

    (例1)第1引数に@又はattribute::と,名前テストを指定した場合(@とattribute::は同じ意味)

    select c2 from t2
      where xmlexists('/root/child::elm1[fn:contains(@attr1,"ABC")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    (例2)第1引数に@又はattribute::と,属性テストを指定した場合(@とattribute::は同じ意味)

    select c2 from t2
      where xmlexists('/root/child::elm1[fn:contains(@attribute(),"ABC")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    (例3)第1引数に属性テストだけを指定した場合

    select c2 from t2
      where xmlexists('/root/child::elm1[fn:contains(attribute(),"ABC")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    (例4)第1引数に文脈項目式を指定した場合

    select c2 from t2
      where xmlexists('/root/child::elm1/text()[fn:contains( . ,"ABC")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

  3. hi-fn:contains関数の第1引数を含む部分構造パスが次の形式で指定されており,さらに第1引数が次のテキストステップ式,テキストステップ式終端,又は属性ステップ式終端の形式で指定されている。また,HiRDB XML Extensionのバージョンが08-04以降である。

    部分構造パス:: = 〔XML名前空間宣言〕… 部分構造パス式
    XML名前空間宣言:: = {declare namespace 接頭辞 = XML名前空間URI;
                       |declare default element namespace XML名前空間URI;}
    部分構造パス式:: = 〔{/ | //}ステップ式 …〕
                        {/ | //}{テキストステップ式 | 属性ステップ式終端}
    ステップ式:: = {〔child::〕 名前テスト | 文脈項目式}
    テキストステップ式:: = 〔{child::|descendant::}〕テキストテスト
                           〔/テキストステップ式終端〕
    テキストステップ式終端:: = 文脈項目式
    属性ステップ式終端:: = {{attribute:: | @} 名前テスト
                       | 〔{attribute:: | @}〕 属性テスト}
    文脈項目式:: = ピリオド
    ピリオド:: = .
    名前テスト:: = {修飾名 | * | 接頭辞:* | *:局所名}
    修飾名:: = 〔接頭辞:〕局所名 

    (例1)第1引数にテキストテストを指定した場合

    select c2 from t2
      where xmlexists('/root/elm1[hi-fn:contains(text(),"""ABC AND DEF""")]'
            passing by value c1)
     
    select c2 from t2
      where xmlexists('/root/elm1[hi-fn:contains(descendant::text(),"""ABC AND DEF""")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    (例2)第1引数にテキストテスト及び文脈項目式を指定した場合

    select c2 from t2
      where xmlexists('/root/elm1[hi-fn:contains(text()/.,"""ABC AND DEF""")]'
            passing by value c1)
     
    select c2 from t2
      where xmlexists('/root/elm1[hi-fn:contains(descendant::text()/.,"""ABC AND DEF""")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    (例3)第1引数に文脈項目式を指定した場合

    select c2 from t2
      where xmlexists('/root/elm1/text()[hi-fn:contains( . ,"""ABC AND DEF""")]'
            passing by value c1)
     
    select c2 from t2
      where xmlexists('/root/elm1/ descendant::text()[hi-fn:contains( . ,"""ABC AND DEF""")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    (例4)第1引数に@又はattribute::と,名前テストを指定した場合(@とattribute::は同じ意味)

    select c2 from t2
      where xmlexists('/root/elm1[hi-fn:contains(@attr1,"""ABC AND DEF""")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    (例5)第1引数に@又はattribute::と,属性テストを指定した場合(@とattribute::は同じ意味)

    select c2 from t2
      where xmlexists('/root/elm1[hi-fn:contains(@attribute(),"""ABC AND DEF""")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

    (例6)第1引数に属性テストだけを指定した場合

    select c2 from t2 
      where xmlexists('/root/elm1[hi-fn:contains(attribute(),"""ABC AND DEF""")]'
            passing by value c1)

     注 アンダーライン部分が上記の形式と一致する部分構造パスです。

  4. XMLEXISTS述語のXQuery問合せ中に指定した文字列の長さが32,000バイト以下である。

    (例)

    select c2 from t2
      where xmlexists('/root/elm1[fn:contains(@attr1,"ABCDEF")]'
            passing by value c1)

    注 アンダーライン部分が32,000バイト以下の文字列です。

  5. 2.又は3.の形式で指定した部分構造パスと比較する値が文字列のXQuery定数である。

    (例)

    select c2 from t2
      where xmlexists('/root/child::elm1[fn:contains(@attr1,"ABC")]'
            passing by value c1)

    注 アンダーライン部分が文字列のXQuery定数です。

  6. XMLEXISTS述語のXQuery問合せ中の部分構造パス式に指定した,/,//,@,及び局所名の長さの和(部分構造パス式の1文字目の/は除く)が1,024バイト以下である。

    (例)

    select c2 from t2
      where xmlexists('/root/elm1[fn:contains(@attr1,"ABCDEF")]'
            passing by value c1)

    注 アンダーライン部分が1,024バイト以下の部分構造パス式です。

  7. XMLEXISTS述語のXQuery問合せ中に指定した部分構造パス式中での//の指定が一つ以内である。

    (例)

    select c2 from t2
      where xmlexists('/root/elm1[fn:contains(@attr1,"ABCDEF")]'
            passing by value c1)

    注 アンダーライン部分が//の指定が一つ以内の部分構造パス式です。

  8. 検索対象のXML型の列に定義した全文検索インデクスに,次のどのプラグインオプションも指定していない。

    • DELcode=ファイル名

    • NOindex=ファイル名

    • ENGLISH

    • ENGLISH_STANDARD

    プラグインオプションの詳細については,マニュアル「HiRDB XML Extension Version 9」を参照してください。

    (例)

    create index idx6 using type ixxml on t2(c1) in (LOB1)
    PLUGIN'SAMECASE=ON,SAMEWIDE=ON,SAMEY=ON,SAMED=ON,DELcode=ON'

    注 アンダーライン部分がインデクスを使用できるオプションだけを指定した全文検索インデクスです。

(e) インデクスを使用しない場合

次に示す場合は,部分構造インデクス又はXML型全文検索用インデクスを使用しません。

なお,1.及び3.では,次のように定義したインデクスを例文中で使用します。

 create index idx1 on t1(c1) key using unique tag from '/root/elm1/@attr1' as varchar(10)

2.,及び4.では,次のように定義したインデクスを例文中で使用します。

 create index idx3 using type ixxml on t2(c1) in (LOB1)
  1. ‘/root[elm1/@attr1’が”ABC”又は”DEF”であるかを評価するXQueryをXMLEXISTS述語のXQuery問合せに指定する場合

    次の例では,XMLEXISTS述語のXQuery問合せ中のXQuery論理式(AND,OR)すべてをXQuery述語中に指定していないため,インデクスを使用しません。この指定方法では,XMLEXISTS述語の引数のXQuery問合せ(XQuery述語中を除く)に直接XQuery論理式を指定しているため,XQuery問合せの結果は必ず真か偽どちらかのブーリアン値になります。このため,XQuery問合せの結果は空のシーケンスではないのでXMLEXISTS述語の結果は常に真となり,意図した結果になりません(XMLEXISTS述語はXQuery問合せの結果が空のシーケンスの場合だけ偽になり,それ以外は真になる)。

    (例:変更前)

    select c2 from t1
      where xmlexists('/root[elm1/@attr1 = "ABC"] or /root[elm1/@attr1 = "DEF"]'
            passing by value c1)

    注 アンダーライン部分がXQuery述語中に指定していないXQuery論理式(OR)です。

    次のように変更すると,インデクスを使用するようになります。

    (例:変更後)

    select c2 from t1
      where xmlexists('/root[elm1/@attr1 = "ABC" or elm1/@attr1 = "DEF"]'
            passing by value c1)

    注 アンダーライン部分がXQuery述語中に指定したXQuery論理式(OR)です。

  2. ‘/root/elm1’以下のテキストノードを検索するXQueryをXMLEXISTS述語のXQuery問合せに指定する場合

    次の例では,contains関数の第1引数を含む部分構造パスのテキストステップ式終端が,(4)(c)の2.で示した形式と一致しないため,インデクスを使用しません。

    (例:変更前)

    select c2 from t2 
      where xmlexists('/root[fn:contains(elm1/text(),"ABC")]' passing by value c1)

    注 アンダーライン部分が,(4)(c)の2.で示した形式と一致しない部分構造パスです。

    次のように変更すると,インデクスを使用するようになります。

    (例:変更後)

    select c2 from t2
      where xmlexists('/root/elm1/text()[fn:contains( . ,"ABC")]'
            passing by value c1)

    注 アンダーライン部分が,(4)(c)の2.で示した形式と一致する部分構造パスです。

  3. ‘/root/elm1/@attr1/’が”ABC”であるかを評価するXQueryをXMLEXISTS述語のXQuery問合せに指定する場合

    XMLEXISTS述語のXQuery問合せ中で条件として指定した部分構造パスの部分構造パス式が,(4)(b)の9.で示した形式と一致しないため,インデクスを使用しません。

    (例:変更前)

    select c2 from t1
      where xmlexists('$A/root/elm1[@attr1 eq "ABC"]'
            passing by value c1,c1 as A)

    注 アンダーライン部分が,(4)(b)の9.で示した形式と一致しない部分構造パスです。

    次のように変更すると,インデクスを使用するようになります。

    (例:変更後)

    select c2 from t1
      where xmlexists('/root/elm1[@attr1 eq "ABC"]'
            passing by value c1,c1 as A)

    注 アンダーライン部分が,(4)(b)の9.で示した形式と一致する部分構造パスです。

  4. 論理演算子(OR,AND)でXMLEXISTS述語を多数連結した場合

    HiRDBが見積もるアクセスコストによって,インデクスを使用しない方が最適なアクセスパスとなると判断し,XMLEXISTS述語の評価にインデクスを使用しません。hi-fn:contains関数を指定した場合はインデクスだけで評価できないため,SQLエラーとなります。

    (例:変更前)

    select c2 from t2
      where xmlexists('/root/elm1[hi-fn:contains(text(),"""01ABC""")]'
            passing by value c1)
         or xmlexists('/root/elm1[hi-fn:contains(text(),"""02ABC""")]'
            passing by value c1)
            …(省略)…
         or xmlexists('/root/elm1[hi-fn:contains(text(),"""30ABC""")]'
            passing by value c1)

    注 アンダーライン部分が,単独の指定ではインデクスを使用するXMLEXISTS述語を30個指定した条件です。

    次のように使用インデクスのSQL最適化指定をすると,インデクスを使用するようになります。

    (例:変更後)

    select c2 from t2 with index(idx3,idx3)
      where xmlexists('/root/elm1[hi-fn:contains(text(),"""01ABC""")]'
            passing by value c1)
         or xmlexists('/root/elm1[hi-fn:contains(text(),"""02ABC""")]'
            passing by value c1)
            …(省略)…
         or xmlexists('/root/elm1[hi-fn:contains(text(),"""30ABC""")]'
            passing by value c1)

    注 アンダーライン部分が,複数インデクス利用の実行に必要な種類のインデクスを指定した,インデクスのSQL最適化指定です。