スケーラブルデータベースサーバ HiRDB Version 8 システム導入・設計ガイド(UNIX(R)用)

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

7.4.2 XML型

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

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

<この項の構成>
(1) 書籍管理表の定義
(2) インデクスの定義
(3) 表へのデータの格納
(4) インデクスの使用条件

(1) 書籍管理表の定義

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

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

(2) インデクスの定義

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

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

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

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

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

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

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

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

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

XML型全文検索用インデクスを使用した検索については,マニュアル「HiRDB Version 8 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 8」を参照してください。
  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 8 コマンドリファレンス」を参照してください。
  3. ログレスモードでpdloadコマンドを実行しているため,データロード対象RDエリアのバックアップを取得します。RDエリア単位のバックアップの取得方法については,マニュアル「HiRDB Version 8 システム運用ガイド」を参照してください。
  4. pdrelsコマンドで,データロード対象RDエリアの閉塞を解除します。

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

補足事項
  • ログレスモードでpdloadコマンドを実行するため,前記の手順1〜3の間はデータロード対象RDエリアを閉塞したままにしてください。
  • 改竄防止表に対してpdloadコマンドでデータロードするとき,-dオプションは使用できません。
  • インデクス一括作成中にエラーが発生した場合の対処方法については,「7.6 インデクス一括作成中に発生したエラーの対処方法」を参照してください。
(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)で説明した二つのインデクスの使用条件について説明します。

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

表7-3 部分構造インデクスの使用条件

USING UNIQUE TAGの指定 XQuery指定箇所 XQuery中の演算子又は関数 部分構造インデクスの使用条件
あり XMLEXISTS述語 = (a)1,2,3
(b)1,2,5,6,7,8,9
!=,>,>=,<,<=,<>,eq,ne,gt,ge,lt,le,
fn:contains,
fn:starts-wtih,
fn:ends-with
(a)1,2,3
(b)1,2,4,6,7,8,9
XMLQUERY関数 = (c)1,2,3
なし XMLEXISTS述語 = (a)1,2,3
(b)1,3,5,6,7,8,9
!=,>,>=,<,<=,<> (a)1,2,3
(b)1,3,4,6,7,8,9
fn:contains
fn:starts-wtih
fn:ends-with
(a)1,2,3
(b)1,3,4,6,7,8,10
XMLQUERY関数 = (c)1,2,3

注※
(a)は,(a)で説明する部分構造インデクス及びXML型全文検索用インデクス共通の使用条件を示します。
(b)は,(b)で説明する部分構造インデクスの使用条件を示します。
(c)は,(c)で説明するXMLQUERY関数のXQueryに関する部分構造インデクスの使用条件を示します。
また,数字は(a),(b),及び(c)での項番に対応しています。

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

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

XQuery指定箇所 XQuery中の演算子又は関数 XML型全文検索用インデクスの使用条件
XMLEXISTS述語 =
fn:contains
fn:starts-wtih
fn:ends-with
(a)1,2,3
(d)1,2,4,5,6,7,8
hi-fn:contains (a)1,2,3
(d)1,3,4,5,6,7,8

注※
(a)は,(a)で説明する部分構造インデクス及びXML型全文検索用インデクス共通の使用条件を示します。
(d)は,(d)で説明するXML型全文検索用インデクスの使用条件を示します。
また,数字は(a)及び(d)での項番に対応しています。

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

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

部分構造インデクス,及びXML全文検索用インデクスの両方が使用可能なXQuery中の演算子,又は関数を使用して検索する場合,使用されるインデクスは演算子,又は関数によって決まります。異なるインデクスを使用したい場合は,マニュアル「HiRDB Version 8 SQLリファレンス」の「使用インデクスのSQL最適化指定」で使用するインデクスを指定することができます。

表7-5 複数のインデクスが使用可能な演算子又は関数の場合に使用されるインデクス

部分構造インデクス,及びXML型全文検索用インデクスの両方が使用可能なXQuery中の演算子又は関数 検索に使用されるインデクス
= 部分構造インデクス
fn:contains XML型全文検索用インデクス
fn:starts-wtih 部分構造インデクス
fn:ends-with XML型全文検索用インデクス
(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) 部分構造インデクスの使用条件

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

なお,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.では,次のように定義したインデクスを例文中で使用します。

 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[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,又は外への参照なしスカラ副問合せのどれかである。
    (例)
    select c2 from t1
      where xmlexists('/root/elm1[@attr1 eq $A]'
            passing by value c1,'ABC' as A)
    注 アンダーライン部分がXQuery問合せ中のXQuery変数に渡す値式です(定数)。
  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)
    注 アンダーライン部分が上記の形式と一致する部分構造パスです。
    以下,(例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)
    注 アンダーライン部分が上記の形式と一致する部分構造パスです。
(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)第一引数に@,又はattribute::と,名前テストを指定した場合(@とattribute::は同義)
    select c2 from t2
      where xmlexists('/root/child::elm1[fn:contains(@attr1,"ABC")]'
            passing by value c1)
    注 アンダーライン部分が上記の形式と一致する部分構造パスです。
    (例2)第一引数に@,又はattribute::と,属性テストを指定した場合(@とattribute::は同義)
    select c2 from t2
      where xmlexists('/root/child::elm1[fn:contains(@attribute(),"ABC")]'
            passing by value c1)
    注 アンダーライン部分が上記の形式と一致する部分構造パスです。
    (例3)第一引数に属性テストのみを指定した場合
    select c2 from t2
      where xmlexists('/root/child::elm1[fn:contains(attribute(),"ABC")]'
            passing by value c1)
    注 アンダーライン部分が上記の形式と一致する部分構造パスです。
    (例4)第一引数に文脈項目式を指定した場合
    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)第一引数にテキストを指定した場合
    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)第一引数にテキストテストおよび文脈項目式を指定した場合
    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)第一引数に文脈項目式を指定した場合
    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)第一引数に@又はattribute::と,名前テストを指定した場合(@とattribute::は同義)
    select c2 from t2
      where xmlexists('/root/elm1[hi-fn:contains(@attr1,"""ABC AND DEF"
    "")]'
            passing by value c1)
    注 アンダーライン部分が上記の形式と一致する部分構造パスです。
    (例5)第一引数に@,又はattribute::と,属性テストを指定した場合(@とattribute::は同義)
    select c2 from t2
      where xmlexists('/root/elm1[hi-fn:contains(@attribute(),"""ABC AND DEF""")]'
            passing by value c1)
    注 アンダーライン部分が上記の形式と一致する部分構造パスです。
    (例6)第一引数に属性テストのみを指定した場合
    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型の列に定義した全文検索インデクスに,以下のどのプラグインオプションも指定していない。
    プラグインオプションの詳細は,マニュアル「HiRDB XML拡張機能 HiRDB XML Extension Version 8」の「2.5.4 インデクスの定義」を参照してください。
    • DELcode=ファイル名
    • NOindex=ファイル名
    • ENGLISH
    • ENGLISH_STANDARD
    (例)
    create index idx6 using type ixxml on t2(c1) in (LOB1) PLUGIN'SAMECASE=
    ON,SAMEWIDE=ON,SAMEY=ON,SAMED=ON,DELcode=ON'
    (アンダーラインがインデクスを使用可能なオプションだけを指定した全文検索インデクス)
(e) インデクスを使用しない場合

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

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

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

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

create index idx3 using type ixxml on t2(c1) in (LOB1)
  1. ‘/root[elm1/@attr1’が”ABC”又は”DEF”であるかを評価するXQueryをXMLEXISTS述語のXQuery問合せに指定する場合
    (例:変更前)
    select c2 from t1
      where xmlexists('/root[elm1/@attr1 = "ABC"] or /root[elm1/@attr1 = "DEF"]'
            passing by value c1)
    注 アンダーライン部分がXQuery述語中に指定していないXQuery論理式(OR)です。
    上記の例では,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 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個指定した条件です。
    次のように変更すると,インデクスを使用するようになります。
    (例:変更後)
    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最適化指定です。