C XMLIndex非構造化コンポーネント
Bツリー索引は、個々のXML要素または属性を表す特定のデータベース列や、構造化ドキュメントの特定部分に適用されるXMLIndex
構造化コンポーネントに対して定義します。これに対し、XMLIndex
索引の非構造化コンポーネントは、デフォルトで非常に汎用性に富んでいます。
ノート:
非構造化XML索引は23aiでは非推奨であり、XML検索索引に置き換えられています。Oracleでは、非構造化XML索引をXML検索用索引として再作成し、トランスポータブル・バイナリXMLとともに使用することをお薦めします。
索引付けに使用する特定のXPath式や使用しない特定のXPath式を限定することにより焦点を絞り込んだ場合を除き、非構造化XMLIndex
コンポーネントはXMLデータのすべての使用可能なXPath式に適用されます。
XMLIndex
索引の非構造化コンポーネントは、次の3つの論理部分で構成されます。
-
パス索引 – これは文書のXMLタグを索引付けし、様々な文書のフラグメントを識別します。
-
順序索引 – XML文書におけるノードの階層的な位置を索引付けします。親と子、祖先と子孫、および兄弟の関係を追跡します。
-
値索引 – XML文書の値を索引付けします。値の等価性または値の範囲による参照が可能です。値索引は、問合せ述語(
WHERE
句)の値に使用されます。
XMLIndex
索引の非構造化コンポーネントは、パス表と、そのパス表の一連の(ローカルの)2次索引を使用します。これらは前述の論理部分を実装します。2つの2次索引が自動的に作成されます。
-
pikey索引: パスおよび順序の両方の論理索引を実装します。
-
値索引: 論理値の索引を実装します。
これらの2つの索引を変更したり、追加の2次索引を作成できます。パス表とその2次索引はすべて、XMLIndex
索引が作成される実表の所有者によって所有されます。
pikey索引は、パスと順序の関係を処理し、ほとんどの場合で最適なパフォーマンスが得られます。値索引を取得すべきときに取り出されない場合は、パスおよび順序の関係で個別の索引をpikey索引のかわりに使用できます。このような(オプション)の索引は、それぞれパスID索引および順序キー索引と呼ばれます。特定の場合の要件でpikey索引が不十分の場合は、最適な結果を得るためにOracleサポートに問い合せてください。
パス表では、XML文書で索引付けされる1つのノードに対して1行が使用されます。索引付けされたノードごとに、パス表には次のものが格納されます。
-
文書を格納する表に対応するROWID。
-
対応する文書のフラグメントへの高速アクセスを提供するロケータ。XML Schemaに基づくデータのバイナリXML記憶域については、データ型情報も格納します。
-
文書におけるノードの階層的な位置を記録するための順序キー。これは、図書目録やインターネット・プロトコルSNMPで使用されるような、デューイ10進分類キーのようなものです。このようなシステムでは、
3.21.5
というキーは、文書のルート・ノードの3番目の子の21番目の子の5番目の子というノード位置を表します。 -
ノードに対するXPathパスを表す識別子。
-
ノードの有効なテキスト値。
表C-1 XMLIndexのパス表
列 | データ型 | 説明 |
---|---|---|
|
|
ノードのXPathパスに対する一意の識別子です。 |
|
|
XMLデータを格納するために使用される表のROWIDです。 |
|
|
ノードの階層的な位置を識別するための、10進数の順序キーです。(ドキュメントの順序は保持されます。) |
|
|
フラグメント位置情報です。フラグメント抽出に使用されます。XML Schemaに基づくデータのバイナリXML記憶域では、データ型情報もここに格納されます。 |
|
|
ノードの有効テキスト値。 |
非構造化コンポーネントを含むXMLIndex索引に関連するタスクは、非構造化コンポーネントを含むXMLIndex
索引に関連するいくつかのユーザー・タスクのドキュメントを識別します。
表C-2 構造化されていないコンポーネントを含むXMLIndex索引に関連するタスク
操作の詳細 | 参照先 |
---|---|
非構造化コンポーネントが含まれる |
|
|
|
|
|
|
|
|
|
|
|
パス表の指定による、構造化されていないコンポーネントを含むXMLIndex索引の取得 |
|
|
|
|
|
パス表の |
|
パス表の |
|
パス表の |
|
パス表の |
|
|
|
|
|
|
|
|
述語を含む非定型XML問合せをサポートする必要がある場合は、非構造化コンポーネントでXMLIndex
を使用できます(「XMLIndex非構造化コンポーネント」を参照)。
pikey索引では、パス表の列PATHID
、RID
およびORDER_KEY
を使用して、パスと順序の索引を表します。オプションのパスID索引では、列PATHID
およびRID
を使用して、パス索引を表します。値索引は、VALUE
列に対する索引です。
例C-1では、2つの購買オーダーのパス表の内容を見ていきます。
例C-1 2つの購買オーダーのパス表の内容
<PurchaseOrder>
<Reference>SBELL-2002100912333601PDT</Reference>
<Actions>
<Action>
<User>SVOLLMAN</User>
</Action>
</Actions>
. . .
</PurchaseOrder>
<PurchaseOrder>
<Reference>ABEL-20021127121040897PST</Reference>
<Actions>
<Action>
<User>ZLOTKEY</User>
</Action>
<Action>
<User>KING</User>
</Action>
</Actions>
. . .
</PurchaseOrder>
これらの発注書を格納するXMLType
表または列のXMLIndex
索引には、XML文書で索引付けされたノードに対し、1行ずつ使用するパス表が含まれます。仮に、XPath式に従ってノードに索引付けする際、システムによって次のPATHID
が割り当てられるとします。
PATHID | 索引付けされたXPath |
---|---|
|
|
|
|
|
|
|
|
|
|
結果として作成されるパス表は、次のようになります(LOCATOR
列は示されません)。
PATHID | RID | ORDER_KEY | VALUE |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 非構造化コンポーネントを含むXMLIndexを使用するためのガイドライン
非構造化コンポーネントを含むXMLIndex
を使用する際に役立つ複数のガイドラインがあります。 - 表パスは透過的であり、無視
パス表の列に2次索引を作成した場合でも、パス表そのものは通常は無視できます。 - XMLIndexパス表のVALUE列
VALUE
列の2次索引は、一致する文字列に関する述語を有するWHERE
句のXPath式で使用されます。たとえば: - VALUE列に対する2次索引
XMLIndex
索引を作成する際、VALUE
列に対して2次索引を指定しない場合でも、VALUE
列に対してデフォルトの2次索引が作成されます。このデフォルト索引には、デフォルトのプロパティがあります。具体的には、これはtext(文字列値)データでのみ使用される索引です。 - XMLIndex非構造化コンポーネントによって索引付けされないXPath式
いくつかのタイプのXPath式は、XMLIndex
により索引付けされません。 - 非構造化コンポーネントを含むXMLIndexの使用
非構造化コンポーネントを含むXMLIndex
索引に対して、該当コンポーネントのパス表や2次索引の操作など、様々な操作を実行できます。 - XMLIndex索引の非同期(遅延)メンテナンス
非構造化コンポーネントのみを含むXMLIndex
索引メンテナンスのコストを遅延して、コミット時やデータベースの負荷が軽減されているときにのみ、メンテナンスを実行できます。これにより、DMLパフォーマンスを向上させることができ、索引の同期化時に非同期索引行のバルク・ロードを有効にできます。 - 非構造化XMLIndexの利点
オブジェクト・リレーショナル形式のXMLType
記憶域では、Bツリー索引を効果的に使用できます。基礎となるオブジェクトを直接ターゲット化することで、焦点がより明確に絞られます。ただし、バイナリXMLを使用して格納されているXML文書の詳細な構造(要素および属性)を指定する場合、通常は効果を発揮しません。これはXMLIndex
の特殊ドメインです。 - XMLIndexパスのサブセット化: 索引付けするパスの指定
問い合せる可能性の高いXPath式がわかっている場合は、XMLIndex
の索引付けの焦点を絞り、パフォーマンスを高めることもできます。 - 非構造化索引のCREATE INDEXおよびALTER INDEXのPARAMETERS句
親トピック: 付録
非構造化コンポーネントを含むXMLIndexを使用するためのガイドライン
非構造化コンポーネントを含むXMLIndex
を使用する際に役立つ複数のガイドラインがあります。
これらのガイドラインは、ここで説明する2つの方法によって同じ結果セットが戻される場合にのみ該当します。
-
祖先要素の接頭辞として
//
を付加しないでください。たとえば、同じ結果セットを戻す場合、/a/b
//c
ではなく、//c
を使用します。 -
祖先要素の接頭辞として
/*
を付加しないでください。たとえば、同じ結果セットを返す場合、/a
/*/*
ではなく、/*/*/*
を使用します。 -
WHERE
句では、XMLQuery
のXMLCast
ではなく、XMLExists
を使用します。これにより最適化が可能になり、パス表VALUE
列に対して副問合せが実際に起動されます。たとえば、次のように記述します。SELECT count(*) FROM purchaseorder p WHERE XMLExists('$p/PurchaseOrder/LineItems/LineItem/Part[@Id="715515011020"]' PASSING OBJECT_VALUE AS "p");
次のように記述しないでください。
SELECT count(*) FROM purchaseorder p WHERE XMLCast(XMLQuery('$p/PurchaseOrder/LineItems/LineItem/Part/@Id' PASSING OBJECT_VALUE AS "p" RETURNING CONTENT) AS VARCHAR2(14)) = "715515011020";
-
可能な場合、
SELECT
句では、count(XMLCast(XMLQuery(...))
ではなく、count(*)
を使用します。たとえば、発注書のLineItem
要素にDescription
の子が1つしかないことがわかっている場合は、次のように記述します。SELECT count(*) FROM po_binxml, XMLTable('//LineItem' PASSING OBJECT_VALUE);
次のように記述しないでください。
SELECT count(li.value) FROM po_binxml p, XMLTable('//LineItem' PASSING p.OBJECT_VALUE COLUMNS value VARCHAR2(30) PATH 'Description') li;
-
問合せの
FROM
リストで使用されるXPath式の数は、なるべく少なくしてください。たとえば、次のように記述します。SELECT li.description FROM po_binxml p, XMLTable( 'PurchaseOrder/LineItems/LineItem' PASSING p.OBJECT_VALUE COLUMNS description VARCHAR2(256) PATH 'Description') li;
次のように記述しないでください。
SELECT li.description FROM po_binxml p, XMLTable('PurchaseOrder/LineItems' PASSING p.OBJECT_VALUE) ls, XMLTable('LineItems/LineItem' PASSING ls.OBJECT_VALUE COLUMNS description VARCHAR2(256) PATH 'Description') li;
-
仮想表(
XMLTable
SQL/XML関数などで作成)の内部をドリルダウンするために、問合せでXPath式を使用する場合は、sys_orderkey_depth
Oracle SQL関数を使用してパス表の順序キーの2次索引を作成します。このような問合せを次に例示します。選択により仮想的な明細項目表li
内のDescription
要素にナビゲートします。SELECT li.description FROM po_binxml p, XMLTable( 'PurchaseOrder/LineItems/LineItem' PASSING p.OBJECT_VALUE COLUMNS description VARCHAR2(256) PATH 'Description') li;
このような問合せは
sys_orderkey_depth
関数によって評価されます。この関数は、order-key値の深度を戻します。順序索引は2列を使用するため、必要となる索引は、ORDER_KEY列およびRID
列、およびORDER_KEY
値に対して適用されたsys_orderkey_depth
関数のコンポジット
索引です。たとえば:CREATE INDEX depth_ix ON my_path_table (RID, sys_orderkey_depth(ORDER_KEY), ORDER_KEY);
例C-8も参照してください。
親トピック: XMLIndex非構造化コンポーネント
表パスは透過的であり、無視
パス表の列に2次索引を作成した場合でも、パス表そのものは通常は無視できます。
パス表には、それをDESCRIBE
したり、(2次)索引を作成したりする以外はアクセスできません。パス表に関する統計を明示的に収集する必要はありません。統計は、XMLIndex
索引、またはXMLIndex
索引が定義されている実表についてのみ収集する必要があります。統計は収集され、パス表と2次索引に透過的に保持されます。
親トピック: XMLIndex非構造化コンポーネント
XMLIndexパス表のVALUE列
VALUE
列の2次索引は、一致する文字列に関する述語を有するWHERE
句のXPath式で使用されます。たとえば:
/PurchaseOrder[Reference/text() = "SBELL-2002100912333601PDT"]
列VALUE
には、要素または属性ノードの有効テキスト値が格納されます。索引付けの際、コメントおよび処理命令は無視されます。
-
属性では、有効テキスト値は属性値です。
-
単純な要素(子のない要素)では、有効テキスト値は、要素のすべてのテキスト・ノードを連結したものになります。
-
複雑な要素(子のある要素)では、有効テキスト値は、(1)要素そのもののテキスト・ノードを連結したもの、(2)単純要素のすべての子孫の有効テキスト値になります。(これは再帰的定義です。)
ただし、有効テキスト値は4000バイト(単純な要素または属性の場合)および80バイト(複雑な要素の場合)に制限(切捨て)されます。
VALUE
列のサイズは、VARCHAR2(4000)
に固定されています。索引の作成または更新時のオーバーフロー(4000バイト超)は、すべて切り捨てられます。
VALUE
列に対する4000バイトの上限に加え、当該列に対して作成される2次索引のキーのサイズにも制限があります。これは、Bツリー索引とファンクション索引にも該当します。XMLIndex
の制限ではありません。索引キーのサイズの限界は、データベースのブロック・サイズの関数です。VALUE
に対してどの程度の索引付けがなされるかは、この制限値によって決定します。
つまり、有効テキスト値の最初の4000バイトのみがVALUE
列に格納され、VALUE列の最初のN
バイトに対してのみ索引が作成されるということです。ここでNとは、索引キーのサイズの制限を表します(N < 4000)。索引キーのサイズの制限が課されることにより、VALUE
列の索引は、有効テキスト値の事前フィルタとしてのみ機能します。
たとえば、データベースのブロック・サイズにより、VALUE
列の索引を800バイト以内に抑え、有効テキスト値のうち最初の800バイト分のみを索引付けするとします。有効テキスト値の最初の800バイト分に対してXMLIndexを
使用してテストを実行し、そのテキスト接頭辞が問合せ値に一致した場合のみ、残りの有効テキスト値がテストされます。
VALUE
列の2次索引は、substr
SQL関数(サブストリング等価性)です。この関数を使用して、テキスト接頭辞をテストするためです。このファンクション索引は、VALUE
列に対するXMLIndex
の実装の一環として自動的に作成されます。
たとえば、問合せのWHERE
句のXPath式/PurchaseOrder[Reference/text() = :1]
は、実質的に、次のようなテストにリライトされることがあります。
substr(VALUE, 1 800) = substr(:1, 1, 800) AND VALUE = :1;
この結合は2つの部分から構成され、左から右に向かって処理されます。1つ目のテストでは、substr
関数の索引を事前フィルタとして使用し、冒頭800バイトがバインド変数:1
の冒頭800バイトに一致しないテキストを削除します。
索引は、1つ目のテストでのみ使用されます。VALUE
列の完全な値は索引付けされません。1つ目のテストで事前フィルタリングを実行した後、2つ目のテストで有効テキスト値全体をチェックします。つまり、VALUE
列の完全な値と、:1
の値の等価性を確認します。このチェックでは索引は使用されません。
テキストの冒頭800バイトのみが索引付けされる場合でも、問合せパフォーマンスでは、最大4000バイトをVALUE
列に格納することが重要になります。これにより、CLOB
インスタンスのXML文書内の深い部分からデータを抽出することなく、データに迅速かつ直接的にアクセスできるようになるからです。有効テキスト値が4000バイトを超える場合は、WHERE
句結合の2つ目のテストにおいて、実表データにアクセスする必要があります。
VALUE
列に対する4000バイト上限も、索引キーのサイズも、問合せ結果には何の影響も与えません。これらはパフォーマンスにのみ影響を与えます。
ノート:
VALUE
に対して作成されたOracle Text CONTEXT
索引は、VALUE
列が切り捨てられることがあるために、間違った結果を戻す可能性があります。
前述したように、XMLIndex
はXML Schemaに基づくデータで使用できます。XML Schemaが特定の要素または属性に対してdefaultValue
値を指定し、特定の文書が当該の要素または属性に対して値を指定しない場合、defaultValue
値がVALUE
列で使用されます。
親トピック: XMLIndex非構造化コンポーネント
VALUE列に対する2次索引
XMLIndex
索引を作成する際、VALUE
列に対して2次索引を指定しない場合でも、VALUE
列に対してデフォルトの2次索引が作成されます。このデフォルト索引には、デフォルトのプロパティがあります。具体的には、これはtext(文字列値)データでのみ使用される索引です。
ただし、異なる種類のVALUE
索引を作成できます。たとえば、数値の索引が問合せの大半に適している場合は、数値の索引を作成できます。VALUE
列に対し、複数の2次索引を作成できます。特定の種類の索引は、それが適切な場合にのみ使用されます。たとえば、数値の索引は、VALUE
列が数値である場合にのみ使用されます。その他の値の場合は無視されます。パス表の列の2次索引は、その他の2次索引と同様に扱われます。つまり、これらの索引は変更、削除、不使用としてマーキングするなどが可能です。
関連項目:
-
VALUE
列に2次索引を作成する例は、非構造化コンポーネントを含むXMLIndexの使用を参照してください。 -
PARAMETERS
句の構文は、CREATE INDEXおよびALTER INDEXのPARAMETERS句を参照してください。
親トピック: XMLIndex非構造化コンポーネント
XMLIndex非構造化コンポーネントによって索引付けされないXPath式
いくつかのタイプのXPath式は、XMLIndex
により索引付けされません。
-
XPath関数の適用。特に、ユーザー定義のXPath関数は索引付けされません。
-
child
、descendant
、およびattribute
以外の軸(parent
、ancestor
、following-sibling
、preceding-sibling
、following
、preceding
、およびancestor-or-self
の各軸)。 -
共用体演算子
|
(垂直バー)を使用する式。
親トピック: XMLIndex非構造化コンポーネント
非構造化コンポーネントを含むXMLIndexの使用
非構造化コンポーネントを含むXMLIndex
索引に対して、該当コンポーネントのパス表や2次索引の操作など、様々な操作を実行できます。
XMLIndex
索引に非構造化コンポーネントを含めるには、XMLIndex
索引の作成または変更時に、PARAMETERS
句でpath_table_clause
を使用できます。path_table_clause ::=を参照してください。
構造化コンポーネントを指定しない場合、パス表を指定しなくても、索引に非構造化コンポーネントが含まれます。ただし、一般的にはパス表を指定することをお薦めします。これにより他のXMLIndex
操作で参照できる、ユーザー指向の認識可能な名前が含まれるようになります。
例C-2に、非構造化コンポーネントを含むXMLIndex
索引の作成時に、パス表(my_path_table)の名前を付ける方法を示します。
パス表に名前を付けなかった場合、名前はCREATE INDEX
に与えた索引名に基づき、システムによって自動的に生成されます。例C-3に、例6-6で作成したXMLIndex
索引を使用した例を示します。
デフォルトでは、パス表と2次索引の記憶域オプションは、XMLIndex
索引が作成された実表の記憶域プロパティから生成されます。例C-4で示すように、索引の作成時にPARAMETERS
句を使用すると、異なる記憶域オプションを指定できます。CREATE INDEX
(およびALTER INDEX
)のPARAMETERS
句は、一重引用符('
)で囲む必要があります。
XMLIndex
は論理的なドメイン索引であり、物理索引ではないため、すべての物理属性はゼロ(0
)またはNULL
になります。
XMLIndex
索引に非構造化コンポーネントと構造化コンポーネントの両方が含まれる場合は、ALTER INDEX
を使用して非構造化コンポーネントを削除できます。これを実行するには、パス表を削除します。例C-5に、これを示します。(この場合は、構造化コンポーネントも含むことを前提とします。例6-11では、索引に構造化コンポーネントと非構造化コンポーネントの両方が含まれるようになります。)
例C-4では、パス表に対する記憶域オプションの指定に加え、パス表に対する2次索引にも名前を付けています。
パス表の名前と同様、パス表の列の2次索引の名前は、PARAMETERS
句で指定しないかぎり、索引名をベースとして使用して自動的に生成されます。例C-6にこれを示します。これらの名前をパブリック・ビューUSER_IND_COLUMNS
で決定する方法を示します。また、pikey索引で3つの列を使用することも示します。
関連項目:
例C-14に、類似するが、さらに複雑な例を示します。
例C-2 XMLIndex索引のパス表への名前付け
CREATE INDEX po_xmlindex_ix ON po_binxml (OBJECT_VALUE) INDEXTYPE IS XDB.XMLIndex
PARAMETERS ('PATH TABLE my_path_table');
例C-3 XMLIndexパス表のシステム生成名の決定
SELECT PATH_TABLE_NAME FROM USER_XML_INDEXES WHERE TABLE_NAME = 'PO_BINXML' AND INDEX_NAME = 'PO_XMLINDEX_IX'; PATH_TABLE_NAME ------------------------------ SYS67567_PO_XMLINDE_PATH_TABLE 1 row selected.
例C-4 XMLIndex索引の作成時における記憶域オプションの指定
CREATE INDEX po_xmlindex_ix ON po_binxml (OBJECT_VALUE) INDEXTYPE IS XDB.XMLIndex PARAMETERS ('PATH TABLE po_path_table (PCTFREE 5 PCTUSED 90 INITRANS 5 STORAGE (INITIAL 1k NEXT 2k MINEXTENTS 3 BUFFER_POOL KEEP) NOLOGGING ENABLE ROW MOVEMENT PARALLEL 3) PIKEY INDEX po_pikey_ix (LOGGING PCTFREE 1 INITRANS 3) VALUE INDEX po_value_ix (LOGGING PCTFREE 1 INITRANS 3)');
例C-5 XMLIndex非構造化コンポーネントの削除
ALTER INDEX po_xmlindex_ix PARAMETERS('DROP PATH TABLE');
例C-6 XMLIndex索引の2次索引の名前付け
SELECT INDEX_NAME, COLUMN_NAME, COLUMN_POSITION FROM USER_IND_COLUMNS WHERE TABLE_NAME IN (SELECT PATH_TABLE_NAME FROM USER_XML_INDEXES WHERE INDEX_NAME = 'PO_XMLINDEX_IX') ORDER BY INDEX_NAME, COLUMN_NAME; INDEX_NAME COLUMN_NAME COLUMN_POSITION ------------------------------ ------------ --------------- SYS67563_PO_XMLINDE_PIKEY_IX ORDER_KEY 3 SYS67563_PO_XMLINDE_PIKEY_IX PATHID 2 SYS67563_PO_XMLINDE_PIKEY_IX RID 1 SYS67563_PO_XMLINDE_VALUE_IX SYS_NC00006$ 1 4 rows selected.
- XMLIndexパス表に対する追加の2次索引の作成
XMLIndex
非構造化コンポーネントに、2次索引をさらに追加できます。
親トピック: XMLIndex非構造化コンポーネント
XMLIndexパス表に対する追加の2次索引の作成
XMLIndex
非構造化コンポーネントに、2次索引をさらに追加できます。
例例C-9、例C-11、例C-12および例C-13では、例C-4で作成したXMLIndex
索引に2次索引を追加しています。
XMLIndex
索引のパス表のVALUE
列に対し、2次索引をいくつでも追加で作成できます。ファンクション索引やOracle Text索引など、様々な種類が可能です。
問合せの処理時に、指定の索引が指定の要素に対して使用されるかどうかは、その索引が当該値に対して適切であるかどうかや、その索引の使用が費用効率に優れているかどうかによって決まります。
例C-9では、SQL関数substr
を使用して、パス表のVALUE
列に関数索引を作成します。問合せにおいて、XML要素のテキスト・ノードに対してsubstr
がよく使用される場合は便利な方法です。
テキスト・ノードが数値を表す要素が多数ある場合、VALUE
列に対して数値索引を作成すると有効です。ただし、例C-9と同じような方法で数値索引を直接作成すると、要素値のいずれかが数値ではない場合にORA-01722エラー(無効な数値)が発生します。これを例C-10に示します。
ここで必要となるのは、数値の要素に対して使用されるが、数値を持たない要素に対しては無視される索引です。特に、DBMS_XMLINDEX
パッケージのcreateNumberIndex
プロシージャは、この目的でのみ存在するものです。このプロシージャに、データベース・スキーマの名前、XMLIndex
索引、および作成される数値索引を渡します。数値索引の作成は、例C-11に示します。
このような索引は数値を持たない要素を無視するよう設計されているため、この索引が数値を持たない要素を検出することはありません。非数値要素がある場合に、なんらかの理由によりXMLIndex
索引が問合せで使用されなければ、ORA-01722
エラーが発生します。ただし、索引が使用されると非数値データは無視されるため、エラーは発生しません。ここでも、索引の使用により結果セットが変わることはありません。結果はまったく同じですが、索引を使用すると、誤ったデータの検出を防ぐことはできます。
日付値の索引の作成は、数値索引の作成と似ています。この場合は、DBMS_XMLINDEX.createDateIndex
プロシージャを使用します。これを例C-12に示します。
例C-13では、Oracle TextのCONTEXT
索引をVALUE
列に作成します。これは、XML要素のテキスト値に対する全文問合せにおいて便利です。CONTEXT
索引がVALUE
列に対して定義されている場合、述語の評価時に使用されます。Oracle Text索引は、他のすべてのVALUE
列の索引に依存しません。
例C-14の問合せは、XMLIndex
索引のパス表に対して作成されたすべての2次索引を示します。作成された索引は、明確に太字で示されます。特に注意する必要があるのは、VALUE
列に作成されたファンクション索引などは、この例のように表示されない点です。これらの索引の列名は、SYS_NC00007$
などのシステム生成名になります。そのため、WHERE
句でCOLUMN_NAME = 'VALUE'
を使用して問合せを実行しても、これらの列を見ることはできません。
特定のXMLIndex索引が問合せの解決に使用されたかどうかを把握するには、問合せの実行計画を検証します。
構造化コンポーネントでのXMLIndexと同様に、特定のXMLIndex索引を使用できるかどうかは、問合せのコンパイル時にOracle Databaseにより決定されます。つまり、索引に対する問合せにその問合せをリライトできるかどうかによって決まります。
非構造化XMLIndexコンポーネントの場合、問合せ内のXPath式が、XMLIndex索引付けに使用するよう指定したパスのサブセットであることをコンパイル時に断定できない場合、索引の非構造化コンポーネントは使用されません。
特定のXMLIndex索引が問合せの解決に使用されたかどうかを把握するには、問合せの実行計画を検証します。
索引の非構造化コンポーネントが使用される場合、そのパス表、順序キー、またはパスIDが実行計画において参照されます。実行計画は、ドメイン索引が使用されていることを直接的に示したり、XMLIndex索引を名前で参照したりすることはありません。「例C-8」を参照してください。
例C-7に示すように、このような実行計画からパス表の名前から、XMLIndex索引の名前を取得できます
XMLIndexの非構造化コンポーネントは、SELECTリストのXPath式、FROMリストおよび問合せのWHERE句に使用でき、SQL/XML関数XMLQuery、XMLTable、XMLExistsおよびXMLCastに有用です。関数索引(XMLTypeでは非推奨)とは異なり、XMLIndex索引は、文書内のXMLフラグメントからデータを抽出するために使用できます。
関連項目:
-
VALUE
列に対して作成されたOracle TextCONTEXT
索引が間違った結果を戻すことがあります。この詳細は、「XMLIndexパス表のVALUE列」を参照してください。 -
CREATE INDEX
パラメータTRANSACTIONAL
の詳細は、Oracle Textリファレンスを参照してください。 -
DBMS_XMLINDEX
パッケージのPL/SQLプロシージャcreateNumberIndex
およびcreateDateIndex
の詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。
例C-7 パス表名からのXMLIndex索引名の取得
SELECT INDEX_NAME FROM USER_XML_INDEXES WHERE PATH_TABLE_NAME = 'MY_PATH_TABLE'; INDEX_NAME ------------------------------ PO_XMLINDEX_IX 1 row selected.
例C-8 XMLIndexを使用したXMLフラグメントからのデータ抽出
SET AUTOTRACE ON EXPLAIN
SELECT li.description, li.itemno FROM po_binxml, XMLTable('/PurchaseOrder/LineItems/LineItem' PASSING OBJECT_VALUE COLUMNS "DESCRIPTION" VARCHAR(40) PATH 'Description', "ITEMNO" INTEGER PATH '@ItemNumber') li WHERE XMLExists('/PurchaseOrder[Reference="SBELL-2002100912333601PDT"]' PASSING OBJECT_VALUE); DESCRIPTION ITEMNO ---------------------------------------- ---------- A Night to Remember 1 The Unbearable Lightness Of Being 2 Sisters 3 3 rows selected.
Execution Plan ---------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes |Cost (%CPU)| Time | ---------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1546 | 30 (4)|00:00:01 | |* 1 | FILTER | | | | | | |* 2 | TABLE ACCESS BY INDEX ROWID | MY_PATH_TABLE | 1 | 3524 | 3 (0)|00:00:01 | |* 3 | INDEX RANGE SCAN | SYS67616_PO_XMLINDE_PIKEY_IX | 1 | | 2 (0)|00:00:01 | |* 4 | FILTER | | | | | | |* 5 | TABLE ACCESS BY INDEX ROWID | MY_PATH_TABLE | 1 | 3524 | 3 (0)|00:00:01 | |* 6 | INDEX RANGE SCAN | SYS67616_PO_XMLINDE_PIKEY_IX | 1 | | 2 (0)|00:00:01 | | 7 | NESTED LOOPS | | | | | | | 8 | NESTED LOOPS | | 1 | 1546 | 30 (4)|00:00:01 | | 9 | NESTED LOOPS | | 1 | 24 | 28 (4)|00:00:01 | | 10 | VIEW | VW_SQ_1 | 1 | 12 | 26 (0)|00:00:01 | | 11 | HASH UNIQUE | | 1 | 5046 | | | | 12 | NESTED LOOPS | | 1 | 5046 | 26 (0)|00:00:01 | |* 13 | TABLE ACCESS BY INDEX ROWID| MY_PATH_TABLE | 1 | 3524 | 24 (0)|00:00:01 | |* 14 | INDEX RANGE SCAN | SYS67616_PO_XMLINDE_VALUE_IX | 73 | | 1 (0)|00:00:01 | |* 15 | TABLE ACCESS BY INDEX ROWID| MY_PATH_TABLE | 1 | 1522 | 2 (0)|00:00:01 | |* 16 | INDEX RANGE SCAN | SYS67616_PO_XMLINDE_PIKEY_IX | 1 | | 1 (0)|00:00:01 | | 17 | TABLE ACCESS BY USER ROWID | PO_BINXML | 1 | 12 | 1 (0)|00:00:01 | |* 18 | INDEX RANGE SCAN | SYS67616_PO_XMLINDE_PIKEY_IX | 1 | | 1 (0)|00:00:01 | |* 19 | TABLE ACCESS BY INDEX ROWID | MY_PATH_TABLE | 1 | 1522 | 2 (0)|00:00:01 | ---------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(:B1<SYS_ORDERKEY_MAXCHILD(:B2)) 2 - filter(SYS_XMLI_LOC_ISNODE("SYS_P2"."LOCATOR")=1) 3 - access("SYS_P2"."RID"=:B1 AND "SYS_P2"."PATHID"=HEXTORAW('28EC') AND "SYS_P2"."ORDER_KEY">:B2 AND "SYS_P2"."ORDER_KEY"<SYS_ORDERKEY_MAXCHILD(:B3)) filter(SYS_ORDERKEY_DEPTH("SYS_P2"."ORDER_KEY")=SYS_ORDERKEY_DEPTH(:B1)+1) 4 - filter(:B1<SYS_ORDERKEY_MAXCHILD(:B2)) 5 - filter(SYS_XMLI_LOC_ISNODE("SYS_P5"."LOCATOR")=1) 6 - access("SYS_P5"."RID"=:B1 AND "SYS_P5"."PATHID"=HEXTORAW('60E0') AND "SYS_P5"."ORDER_KEY">:B2 AND "SYS_P5"."ORDER_KEY"<SYS_ORDERKEY_MAXCHILD(:B3)) filter(SYS_ORDERKEY_DEPTH("SYS_P5"."ORDER_KEY")=SYS_ORDERKEY_DEPTH(:B1)+1) 13 - filter("SYS_P10"."VALUE"='SBELL-2002100912333601PDT' AND "SYS_P10"."PATHID"=HEXTORAW('4F8C') AND SYS_XMLI_LOC_ISNODE("SYS_P10"."LOCATOR")=1) 14 - access(SUBSTRB("VALUE",1,1599)='SBELL-2002100912333601PDT') 15 - filter(SYS_XMLI_LOC_ISNODE("SYS_P8"."LOCATOR")=1) 16 - access("SYS_P10"."RID"="SYS_P8"."RID" AND "SYS_P8"."PATHID"=HEXTORAW('4E36') AND "SYS_P8"."ORDER_KEY"<"SYS_P10"."ORDER_KEY") filter("SYS_P10"."ORDER_KEY"<SYS_ORDERKEY_MAXCHILD("SYS_P8"."ORDER_KEY") AND SYS_ORDERKEY_DEPTH("SYS_P8"."ORDER_KEY")+1=SYS_ORDERKEY_DEPTH("SYS_P10"."ORDER_KEY")) 18 - access("PO_BINXML".ROWID="SYS_ALIAS_4"."RID" AND "SYS_ALIAS_4"."PATHID"=HEXTORAW('3748') ) 19 - filter(SYS_XMLI_LOC_ISNODE("SYS_ALIAS_4"."LOCATOR")=1) Note ----- - dynamic sampling used for this statement (level=2)
例C-9 パス表のVALUE列に対する関数索引の作成
CREATE INDEX fn_based_ix ON po_path_table (substr(VALUE, 1, 100));
例C-10 パス表のVALUE列に対する、数値索引の直接作成
CREATE INDEX direct_num_ix ON po_path_table (to_binary_double(VALUE)); CREATE INDEX direct_num_ix ON po_path_table (to_binary_double(VALUE)) * ERROR at line 1: ORA-01722: invalid number
例C-11 createNumberIndexプロシージャによる、VALUE列に対する数値索引の作成
CALL DBMS_XMLINDEX.createNumberIndex('OE', 'PO_XMLINDEX_IX', 'API_NUM_IX');
例C-12 createDateIndexプロシージャによる、VALUE列に対する日付索引の作成
CALL DBMS_XMLINDEX.createDateIndex('OE', 'PO_XMLINDEX_IX', 'API_DATE_IX',
'dateTime');
例C-13 パス表のVALUE列に対するOracle Text CONTEXT索引の作成
CREATE INDEX po_otext_ix ON po_path_table (VALUE)
INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('TRANSACTIONAL');
例C-14 XMLIndexのパス表上にある、すべての2次索引の表
SELECT c.INDEX_NAME, c.COLUMN_NAME, c.COLUMN_POSITION, e.COLUMN_EXPRESSION FROM USER_IND_COLUMNS c LEFT OUTER JOIN USER_IND_EXPRESSIONS e ON (c.INDEX_NAME = e.INDEX_NAME) WHERE c.TABLE_NAME IN (SELECT PATH_TABLE_NAME FROM USER_XML_INDEXES WHERE INDEX_NAME = 'PO_XMLINDEX_IX') ORDER BY c.INDEX_NAME, c.COLUMN_NAME; INDEX_NAME COLUMN_NAME COLUMN_POSITION COLUMN_EXPRESSION -------------------- ------------ --------------- ---------------------- API_DATE_IX SYS_NC00009$ 1 SYS_EXTRACT_UTC(SYS_XMLCONV("V ALUE",3,8,0,0,181)) API_NUM_IX SYS_NC00008$ 1 TO_BINARY_DOUBLE("VALUE") FN_BASED_IX SYS_NC00007$ 1 SUBSTR("VALUE",1,100) PO_OTEXT_IX VALUE 1 PO_PIKEY_IX ORDER_KEY 3 PO_PIKEY_IX PATHID 2 PO_PIKEY_IX RID 1 PO_VALUE_IX SYS_NC00006$ 1 SUBSTRB("VALUE",1,1599) 8 rows selected.
関連トピック
親トピック: 非構造化コンポーネントを含むXMLIndexの使用
XMLIndex索引の非同期(遅延)メンテナンス
非構造化コンポーネントのみを含むXMLIndex
索引メンテナンスのコストを遅延して、コミット時やデータベースの負荷が軽減されているときにのみ、メンテナンスを実行できます。これにより、DMLパフォーマンスを向上させることができ、索引の同期化時に非同期索引行のバルク・ロードを有効にできます。
この機能は、非構造化コンポーネントのみが含まれるXMLIndex
索引に適用されます。構造化コンポーネントが含まれるXMLIndex
索引に非同期メンテナンスを指定すると(非構造化コンポーネントも含まれている場合でも)、エラーが発生します。
デフォルトでは、XMLIndex
索引はDML操作のたびに更新(メンテナンス)されますので、実表と常に同期化されます。状況によっては、このようなことは必要なく、従来の索引の使用が許可される場合があります。そのような場合、索引メンテナンスのコストを遅延するよう決定し、コミット時のみまたはデータベースの負荷が軽減されているある時期に実行できます。これにより、DMLのパフォーマンスを向上させることができます。また、索引の同期化を行う際に、非同期索引行のバルク・ロードを有効にすると、索引メンテナンスのパフォーマンスを向上させることができます。
DML操作では従来の索引を使用しても、パフォーマンス以外には影響がありません。ただし、問合せ結果に影響を与えることもあります。問合せ時に索引が最新の状態でない場合は、問合せ結果も最新でない可能性があります。実表の1列のみがXMLType
データ型であったとしても、その表のすべての問合せには、XMLIndex
列のXMLIndex
索引の最終同期時のデータベース・データが反映されます。
CREATE INDEX
文またはALTER INDEX
文のPARAMETERS句を使用し、索引メンテナンスの遅延を指定できます。
XMLIndex
索引の同期化を遅延しても、次のデータベース操作により、索引が自動的に同期化されるので注意が必要です。
-
索引に対するDDL操作 –
ALTER INDEX
または2次索引の作成 -
実表に対するDDL操作 –
ALTER TABLE
または他の索引の作成
表C-3に、同期化オプションと、オプションの指定に使用されるASYNC
句の構文をまとめます。ASYNC
句は、CREATE INDEX
のPARAMETERS
句またはXMLIndex
のALTER INDEX
文で使用されます。
表C-3 索引の同期化
同期化するタイミング | ASYNC句の構文 |
---|---|
常時 |
これはデフォルトの動作です。前の |
コミット時 |
|
定期的 |
|
手動、オン・デマンド |
PL/SQLプロシージャ |
ASYNC
構文のオプションのパラメータであるSTALE
は、将来に備えて用意されているものであり、明示的に指定する必要はありません。ALWAYS
が使用されていれば、値は常にFALSE
になります。それ以外の場合の値はTRUE
です。このルールに反して明示的なSTALE
値を指定すると、エラーが発生します。
例C-15では、明日から毎週月曜日の午後3時に同期化されるXMLIndex索引を作成します。
例C-16では、例C-15で作成された索引を手動で同期化します。
XMLIndex
索引の同期化が遅延されると、索引に対する最終同期化以降、実表に対して加えられたすべてのDML変更(挿入、更新、削除)は、DML操作当たり1行ずつ、保留中の表に記録されます。この表の名前は、静的なパブリック・ビューUSER_XML_INDEXES
、ALL_XML_INDEXES
、およびDBA_XML_INDEXES
のPEND_TABLE_NAME
列の値です。
この表を検証すると、指定のXMLIndex
索引を同期化させる最適な時期を決定できます。保留中の表の行数が多くなると、同期化が必要な索引も多くなります。
保留中の表のサイズが大きい場合、syncIndex
のコール時にパラメータREINDEX
をTRUE
に設定すると、例C-16に示すようにパフォーマンスを向上できます。REINDEX
がTRUE
の場合は、すべての2次索引が削除され、保留中の表データを一括ロードした後に再作成されます。
関連項目:
-
repeat_interval
の構文は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの「カレンダ構文」の項を参照してください。 -
PL/SQLプロシージャ
DBMS_XMLINDEX.syncIndex
の詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。
例C-15 XMLIndexに対する遅延同期の指定
CREATE INDEX po_xmlindex_ix ON po_binxml (OBJECT_VALUE) INDEXTYPE IS XDB.XMLIndex
PARAMETERS ('ASYNC (SYNC EVERY "FREQ=HOURLY; INTERVAL = 1")');
例C-16 SYNCINDEXを使用したXMLIndex索引の手動同期化
EXEC DBMS_XMLINDEX.syncIndex('OE', 'PO_XMLINDEX_IX', REINDEX => TRUE);
- エラーORA-08181が発生した場合のXMLIndex索引の同期化
問合せを行うとエラーORA-08181が発生する場合は、問合せのXMLType
実表に対して、非構造化コンポーネントを含むXMLIndex
索引が作成されているかどうかを確認してください。その場合は、DBMS_XMLINDEX.syncIndex
を使用して、XMLIndex
索引を手動で同期化します。
親トピック: XMLIndex非構造化コンポーネント
エラーORA-08181が発生した場合のXMLIndex索引の同期化
問合せを行うとエラーORA-08181が発生する場合は、問合せのXMLType
実表に対して、非構造化コンポーネントを含むXMLIndex
索引が作成されているかどうかを確認してください。その場合は、DBMS_XMLINDEX.syncIndex
を使用して、XMLIndex
索引を手動で同期化します。
これは、エラーORA-08181が次の状況で発生した場合にのみ適用されます。
- プラガブル・データベース
PDB1
で、XMLType
表または列XTABCOL
を作成し、非構造化コンポーネントが含まれるXMLIndex
索引を使用して索引付けを行った。 PDB1
をコンテナ・データベースに接続している。PDB1
を新しいプラガブル・データベースPDB2
にクローニングした。PDB2
で問合せXTABCOL
を実行すると、エラーORA-08181が発生する。
同期化しても引き続きエラーが発生する場合は、別の原因を探します。エラーORA-08181は様々な状況で発生する可能性のある一般的なエラーで、これは原因の1つにすぎません。
関連トピック
親トピック: XMLIndex索引の非同期(遅延)メンテナンス
非構造化XMLIndexの利点
オブジェクト・リレーショナル形式のXMLType
記憶域では、Bツリー索引を効果的に使用できます。基礎となるオブジェクトを直接ターゲット化することで、焦点がより明確に絞られます。ただし、バイナリXMLを使用して格納されているXML文書の詳細な構造(要素および属性)を指定する場合、通常は効果を発揮しません。これはXMLIndex
の特殊ドメインです。
XMLIndex
はドメイン索引で、XMLデータのドメイン用に特化して設計されています。これは論理的索引です。XMLIndex
索引は、SQL/XML関数XMLQuery
、XMLTable
、XMLExists
およびXMLCast
に対して使用できます。
XMLIndexには、他の索引付け方式に比べ、次のような利点があります。
-
非構造化コンポーネントを含む
XMLIndex
索引では、SELECT
リスト・データとFROM
リスト・データの両方に対するアクセスを高速化でき、特にXMLフラグメント抽出において有用です。ファンクション索引は非推奨になったため、文書のフラグメントの抽出には使用できません。 -
問合せに使用されるXPath式に関する事前の知識は不要です。
XMLIndex
索引の非構造化コンポーネントは、汎用性に富んでいます。ファンクション索引の場合とは異なります。
非構造化XMLIndexに関連するデータ・ディクショナリの静的なパブリック・ビュー
非構造化XMLIndex索引に関する情報をレポートするデータ・ディクショナリ・ビューは、パブリック・ビューUSER_XML_INDEXES
、ALL_XML_INDEXES
およびDBA_XML_INDEXES
を介して構造化XMLIndex索引と共有されます。
構造化XMLIndexと同様に、統計情報は複数のビューで共有されます。
USER_TAB_STATISTICS
、ALL_TAB_STATISTICS
、DBA_TAB_STATISTICS
を問い合せる場合、パス表名を使用してTABLE_NAME
列をフィルタ処理することで、パス表に対する統計を問い合せることができます。
親トピック: XMLIndex非構造化コンポーネント
XMLIndexパスのサブセット化: 索引付けするパスの指定
問い合せる可能性の高いXPath式がわかっている場合は、XMLIndex
の索引付けの焦点を絞り、パフォーマンスを高めることもできます。
非構造化コンポーネントを含むXMLIndex
索引は、非常に汎用性が高いという利点があります。索引付けするXPathの位置を指定する必要もなければ、問合せされるXPath式に関する事前の知識も必要ありません。デフォルトでは、非構造化XMLIndex
コンポーネント索引では、XMLデータのすべての使用可能なXPath位置に索引が作成されます。
ただし、問い合せる可能性の高いXPath式を認識している場合は、XMLIndex
の索引付けの焦点を絞り、パフォーマンスを高めることもできます。索引付けされたノードが少ないほど、索引付けに必要な領域も削減されるため、DML操作中の索引のメンテナンスが向上します。索引付けされたノードの数が少ないほどDDLのパフォーマンスが向上し、パス表が小さいほど問合せのパフォーマンスも向上します。
索引付けされるXMLフラグメントに対応する一連のXPath式(パス)をプルーニングし、可能なすべてのパスのサブセットを指定することで、索引付けの焦点を絞れます。これを行うには、他に2通りの方法があります。
-
除外 – 可能なすべてのXPath式を含めるというデフォルト動作を実行した後に、索引付けに不要なものを除外します。
-
包含 – 索引付けに使用する空白のXPath式の包含セットにパスを追加します。
CREATE INDEX
を使用してXMLIndex
索引を作成するとき、またはALTER INDEX
を使用して索引を修正するときに、パスのサブセット化を指定できます。いずれの場合でも、文のPARAMETERS
句のPATHS
パラメータで、サブセット化情報を提供します。除外の場合は、キーワードEXCLUDE
を使用します。包含の場合は、ALTER INDEX
のときはキーワードINCLUDE
を使用し、CREATE INDEX
のときはキーワードを使用しません(含めるパスをリストします)。また、PATHS
パラメータによってターゲット化されるノードに対し、名前空間マッピングも指定できます。
ALTER INDEX
の場合、キーワードINCLUDE
またはEXCLUDE
の後にキーワードADD
またはREMOVE
を付加すると、キーワードの後に続くパスのリストを包含リストや除外リストに追加するか削除するかを指定できます。たとえば、この文では、索引付けから除外するパスのリストにパス/PurchaseOrder/Reference
を追加します。
ALTER INDEX po_xmlindex_ix REBUILD
PARAMETERS ('PATHS (EXCLUDE ADD (/PurchaseOrder/Reference))');
すべてのパスが含まれるようにXMLIndex
索引を変更するには、キーワードINDEX_ALL_PATHS
を使用します。alter_index_paths_clause ::=を参照してください。
ノート:
構造化および非構造化コンポーネントの両方を持つXMLIndex
索引を作成した場合、デフォルトで、構造化コンポーネント内で索引付けされているノードはすべて、非構造化コンポーネント内でも索引付けされます。つまり、非構造化コンポーネントから自動的に除外されません。非構造化XMLIndex
の索引付けを適用しないようにするには、パスのサブセット化を明示的に使用してそれらを除外する必要があります。
- XMLIndexパスのサブセット化の例
XPath式のサブセットに対し、XMLIndex
索引を定義する例をいくつか示します。 - XMLIndexパスのサブセット化のルール
XMLIndex
パスのサブセット化に適用されるルールについて説明します。
親トピック: XMLIndex非構造化コンポーネント
XMLIndexパスのサブセット化の例
XPath式のサブセットに対し、XMLIndex
索引を定義する例をいくつか示します。
例C-17 CREATE INDEXによるXMLIndexパスのサブセット化
CREATE INDEX po_xmlindex_ix ON po_binxml (OBJECT_VALUE)
INDEXTYPE IS XDB.XMLIndex
PARAMETERS ('PATHS (INCLUDE (/PurchaseOrder/LineItems//*
/PurchaseOrder/Reference))');
この文では、次に示すように、最上位要素であるPurchaseOrder
およびその子に対してのみ索引付けする索引を作成します。
-
すべての
LineItems
要素およびその子孫 -
すべての
Reference
要素
索引に使用される一連の空白のパスに対し、指定のパスを含めていきます。
例C-18 ALTER INDEXによるXMLIndexパスのサブセット化
ALTER INDEX po_xmlindex_ix REBUILD
PARAMETERS ('PATHS (INCLUDE ADD (/PurchaseOrder/Requestor
/PurchaseOrder/Actions/Action//*))');
この文では、索引付けに使用されたパスに対し、2つのパスを追加します。これらのパスは、Requestor
要素と、Action
要素の子孫(およびその祖先)に対して索引付けします。
例C-19 名前空間接頭辞を使用したXMLIndexパスのサブセット化
XMLIndex
索引付けに使用されるXPath式で名前空間接頭辞が使用される場合、NAMESPACE MAPPING
句をPATHS
リストで使用して接頭辞を指定できます。次はその例です。
CREATE INDEX po_xmlindex_ix ON po_binxml (OBJECT_VALUE) INDEXTYPE IS XDB.XMLIndex
PARAMETERS ('PATHS (INCLUDE (/PurchaseOrder/LineItems//* /PurchaseOrder/ipo:Reference)
NAMESPACE MAPPING (xmlns="http://xmlns.oracle.com"
xmlns:ipo="http://xmlns.oracle.com/ipo"))');
XMLIndexパスのサブセット化のルール
XMLIndex
パスのサブセット化に適用されるルールについて説明します。
-
パスはchild軸およびdescendant軸のみを参照し、さらに、要素ノードおよび属性ノード、またはその名前(ワイルドカードを使用可能)のみをテストする必要があります。特に、パスには述語を含めないでください。
-
パス除外とパス包含を一度に指定できません。いずれかの方法を指定する必要があります。
-
パス除外(包含)によって索引が作成された場合は、パス除外(包含)によってのみ修正が可能です。索引の修正は、パスのサブセット化をさらに制限するか、さらに拡張するかのいずれかです。たとえば、特定のパスを含める索引を作成した後に、特定のパスを除外するよう修正することはできません。
非構造化索引のCREATE INDEXおよびALTER INDEXのPARAMETERS句
- PATHS句の使用
PATHS
句を使用する場合は、特定の考慮事項が適用されます。 - create_index_paths_clauseおよびalter_index_paths_clauseの使用
create_index_paths_clause
およびalter_index_paths_clause
を使用する場合は、特定の考慮事項が適用されます。 - pikey_clause、path_id_clauseおよびorder_key_clauseの使用
pikey_clause
、path_id_clause
およびorder_key_clause
の各句は、構文的にそれぞれ省略可能です。pikey索引は、pikey_clause
を指定しない場合でも作成されます。パスID索引または順序キー索引を作成するには、path_id_clause
またはorder_key_clause
をそれぞれ指定する必要があります。 - value_clauseの使用
value_clause
を使用する場合は、特定の考慮事項が適用されます。 - async_clauseの使用
ASYNC
句を使用する場合は、特定の考慮事項が適用されます。
親トピック: XMLIndex非構造化コンポーネント
PATHS句の使用
PATHS
句を使用する場合は、特定の考慮事項が適用されます。
-
CREATE INDEX
文では、PATHS
句を最大で1回使用できます。つまり、create_index_paths_clause
の前に、PATHS
を最大で1回使用できます。 -
create_index_paths_clause
句はCREATE INDEX
でのみ、また、alter_index_paths_clause
句はALTER INDEX
でのみ使用されます。
create_index_paths_clauseおよびalter_index_paths_clauseの使用
create_index_paths_clause
およびalter_index_paths_clause
を使用する場合は、特定の考慮事項が適用されます。
-
INDEX_ALL_PATHS
キーワードは、すべてのパスが含まれた状態で索引を再構築します。このキーワードは、alter_index_paths_clause
でのみ使用でき、create_index_paths_clause
では使用できません。 -
索引に対するパスの明示的なリストには、ワイルドカードおよび
//
を使用できます。 -
XPaths_list
は1つ以上のXpaths式で構成されるリストです。それぞれのリストには、child軸、descendant軸、名前テスト、およびワイルドカード(*
)構造のみが含まれます。 -
create_index_paths_clause
からXPaths_list
が省略されていると、すべてのパスが索引付けされます。 -
XPaths_list
のXPath式で使用される一意の名前空間接頭辞に対し、対応する名前空間情報を提供するには、標準的なXML名前空間
宣言が必要です。 -
索引を削除した後で必要に応じて作成しなおすと、構文に直接反映されない方法で索引を変更できます。たとえば、パスを含めることで定義される索引を、パスを除外することで定義される索引に変更する場合は、索引を削除した後で、
EXCLUDE
を使用して作成しなおします。
pikey_clause、path_id_clauseおよびorder_key_clauseの使用
pikey_clause
、path_id_clause
およびorder_key_clause
の各句は、構文的にそれぞれ省略可能です。pikey索引は、pikey_clause
を指定しない場合でも作成されます。パスID索引または順序キー索引を作成するには、path_id_clause
またはorder_key_clause
をそれぞれ指定する必要があります。
value_clauseの使用
value_clause
を使用する場合は、特定の考慮事項が適用されます。
-
VALUE
列は、VARCHAR2(4000)
として作成されています。 -
value_clause
句がキーワードVALUE
でのみ構成される場合は、通常のデフォルト属性によって値索引が作成されます。 -
path_id_clause
句がキーワードPATH ID
でのみ構成される場合は、通常のデフォルト属性によってパスID索引が作成されます。 -
order_key_clause
句がキーワードORDER KEY
でのみ構成される場合は、通常のデフォルト属性によって順序キー索引が作成されます。
async_clauseの使用
ASYNC
句を使用する場合は、特定の考慮事項が適用されます。
-
この機能は、非構造化コンポーネントのみが含まれる
XMLIndex
索引のみで使用します。構造化コンポーネントが含まれるXMLIndex
索引にASYNC
句を指定すると、エラーが発生します。 -
ALWAYS
とは、各DML文に対して自動同期が行われることを意味します。 -
MANUAL
とは、自動同期が行われないことを意味します。DBMS_XMLINDEX.syncIndex
を使用して、索引を手動同期させる必要があります。 -
EVERY
repeat_interval
とは、repeat_interval
の間隔で索引を自動同期させることを意味します。repeat_interval
の構文は、PL/SQLパッケージDBMS_SCHEDULER
と同じで、二重引用符("
)で囲む必要があります。EVERY
を使用するには、CREATE JOB
権限が必要です。 -
ON COMMIT
とは、コミット操作の直後に索引を同期させることを意味します。コミットは、同期が完了するまでは戻されません。同期は個別の処理として実行されるため、データがコミットされてから、索引の変更がコミットされるまで短い間隔が生じることがあります。 -
STALE
はオプションです。値がTRUE
の場合は、問合せ結果が失効している可能性があります。値がFALSE
の場合は、問合せ結果は常に最新です。デフォルト値と、明示的に指定可能な唯一の値は次のとおりです。-
ALWAYS
の場合、STALE
はFALSE
です。 -
ALWAYS
以外のASYNC
オプションの場合、STALE
はTRUE
です。
-
脚注の説明
脚注1:実際のパス表の実装は多少異なることがあります。