6 XMLTypeデータの索引
頻繁に問い合せるXMLデータの特定部分に着目できるよう当該XMLデータに対して索引を作成し、パフォーマンスを向上できます。XML Schemaに基づくかどうか、および使用されるXMLType
記憶域モデルに関係なく、XMLType
データに索引付けできる様々な方法があります。
ノート:
非構造化XML索引は23aiでは非推奨であり、XML検索索引に置き換えられています。Oracleでは、非構造化XML索引をXML検索用索引として再作成し、トランスポータブル・バイナリXMLとともに使用することをお薦めします。
ここで示す実行計画は、説明のためのみに使用しています。ここで示す例を実際の環境で実行しても、実行計画が同一になるわけではありません。
- 索引に関連するOracle XML DBのタスク
XMLデータの索引に関連する一般的なタスクについて説明します。 - XMLTypeデータの索引付けの概要
- XMLIndex
- XML検索索引: 全文検索およびアドホック問合せの索引付け
トランスポータブル・バイナリXMLとして格納されている大規模な非構造化ドキュメントに対する全文検索または範囲検索機能が必要な場合、Oracleでは、XML検索索引を使用してXMLデータを索引付けすることをお薦めします。 - オブジェクト・リレーショナル形式で格納されたXMLTypeデータの索引付け
XMLノードに対応する基礎となるデータベース列に対してBツリー索引を作成することで、オブジェクト・リレーショナル形式で格納されたXMLType
データを効果的に索引付けできます。
関連項目:
-
索引付けの概要は、Oracle Database概要を参照してください。
-
アプリケーション開発における索引付けの使用方法の詳細は、Oracle Database開発ガイドを参照してください。
親トピック: Oracle XML DBでのXMLデータの操作
索引に関連するOracle XML DBのタスク
XMLデータの索引に関連する一般的なタスクについて説明します。
表6-1は、XMLデータの索引付けに関連するいくつかの基本的なユーザー・タスクの参照先を示します。
表6-1 基本的なXML索引付けタスク
操作の詳細 | 参照先 |
---|---|
索引付けの方法の選択 |
|
|
|
特定の表または列に対する |
|
指定された |
|
|
|
XML検索索引の作成と使用 |
|
XML検索索引を使用した問合せ |
|
オブジェクト・リレーショナル形式で格納された |
オブジェクト・リレーショナル形式で格納されたXMLTypeデータの索引付け、ガイドライン: Ordered Collection Tableに対する索引の作成 |
表6-2は、構造化
コンポーネントを含むXMLIndex索引付けに関連するいくつかのユーザー・タスクの参照先を示します。
表6-2 構造化コンポーネントを含むXMLIndex索引に関連するタスク
操作の詳細 | 参照先 |
---|---|
構造化コンポーネントが含まれる |
|
|
|
構造化コンポーネントが含まれる |
|
|
|
|
表6-3は、XMLIndex
索引付けに関連するその他のユーザー・タスクの参照先を示します。
表6-3 XML検索索引に関連するタスク
次に関する情報は... | 参照先 |
---|---|
XML検索索引の作成方法および使用方法 |
|
XML検索索引のメンテナンス方法 |
|
デフォルト・プリファレンスおよび推奨 |
|
XML検索索引を使用した問合せ方法 |
|
索引移行 |
親トピック: XMLTypeデータの索引
XMLTypeデータの索引付けの概要
XMLデータに構造化、予測可能なデータのアイランドが含まれ、アプリケーションが次の構造化コンテンツのアイランドの値のみを投影する場合:
-
構造化コンポーネントを含む
XMLIndex
を使用して、構造化アイランドを索引付けします。 -
構造化された索引コンポーネントに、使用する問合せが反映されます。既知の問合せのセットは、一定期間に索引定義を正しく更新している場合に変更できます。XMLIndex構造化コンポーネントを参照してください。
また、XMLデータ内で全文検索を使用してコンテンツを問い合せる必要がある場合は、次のようになります。
-
XML検索索引を使用します。「XML検索索引を使用した問合せ」を参照してください。
XMLデータに、高度に構造化および予測可能なデータのアイランドが含まれますか。
-
「はい」の場合: 構造化コンポーネントを含む
XMLIndex
を使用して、アイランドを索引付けします。XMLIndex構造化コンポーネントを参照してください。 -
「いいえ」の場合: 述語を含む非定型XML問合せをサポートする必要はありますか。
-
「はい」の場合: 全文検索述語と範囲検索述語の両方をサポートするようにカスタマイズできるXML検索索引を使用します。
-
「いいえ」の場合: XMLデータを索引付けしないでください。
-
ノート:
XMLIndexとXML検索索引の両方を同じXMLType列に作成できます。問合せ時の索引使用の詳細は、「XML検索索引を使用した問合せ」を参照してください。
親トピック: XMLTypeデータの索引
XMLIndex
ノート:
非構造化XML索引は23aiでは非推奨であり、XML検索索引に置き換えられています。Oracleでは、非構造化XML索引をXML検索用索引として再作成し、トランスポータブル・バイナリXMLとともに使用することをお薦めします。
- XMLIndexの利点
オブジェクト・リレーショナル形式のXMLType
記憶域では、Bツリー索引を効果的に使用できます。基礎となるオブジェクトを直接ターゲット化することで、焦点がより明確に絞られます。ただし、トランスポータブル・バイナリXMLまたはバイナリXMLのいずれかを使用して格納されているXML文書の詳細な構造(要素および属性)を指定する場合、通常は無効です。これはXMLIndex
の特殊ドメインです。 - XMLIndexコンポーネント
XMLIndexは、構造を持つ可能性のあるXMLデータの索引付けに使用されます。これは、トランスポータブル・バイナリXMLとバイナリXMLの両方として格納されるXMLTypeデータに適用されます。 - XMLIndex構造化コンポーネント
XMLコンテンツの固定の構造化アイランドを投影する問合せに対しては、周囲のデータが比較的構造化されていない場合でも、XMLIndex
索引の構造化コンポーネントを作成して使用します。 - XMLIndex索引の作成、削除、変更、および検証
XMLIndex
索引に対する基本操作には、XMLIndex索引の作成、削除、変更および検証が含まれます。例を示します。 - 構造化コンポーネントを含むXMLIndexの使用
XMLIndex
構造化コンポーネントにより、XMLデータ内の構造の特定のアイランドを索引付けします。 - XMLIndexが使用されるかどうかを判別する方法
特定のXMLIndex
索引が問合せの解決に使用されたかどうかを把握するには、問合せの実行計画を検証します。 - XMLIndexの使用の無効化
XMLIndex
の使用を無効にするには、オプティマイザ・ヒント/*+ NO_XML_QUERY_REWRITE */
またはオプティマイザ・ヒント/*+ NO_XMLINDEX_REWRITE */
を使用します。 - 構造化コンポーネントを含むXMLIndexの使用のガイドライン
構造化コンポーネントを含むXMLIndex
を使用する際に役立つ複数のガイドラインがあります。 - XMLIndexのパーティション化および並列度
レンジ・パーティション化、リスト・パーティション化、またはハッシュ・パーティション化を使用して、XMLType
表や、XMLType
列が含まれる表をパーティション化する場合、その表にXMLIndex
索引を作成することもできます。オプションで、索引の作成とメンテナンスが並列で実行されるようにできます。 - コストベース・オプティマイザに対するXMLIndexオブジェクトの統計の収集
Oracle Databaseのコストベース・オプティマイザにより、使用される索引(ある場合)も含め、所定の問合せをどのように評価すると最も費用効率が高いかが決定します。これを正確に実行するには、様々なデータベース・オブジェクトの統計を収集する必要があります。 - XMLIndexに関連するデータ・ディクショナリの静的なパブリック・ビュー
標準的なデータベース索引に関する情報は、静的なパブリック・ビューUSER_INDEXES
、ALL_INDEXES
、およびDBA_INDEXES
にあります。XMLIndex
索引に関する同様の情報も、静的なパブリック・ビューUSER_XML_INDEXES
、ALL_XML_INDEXES
、およびDBA_XML_INDEXES
にあります。 - CREATE INDEXおよびALTER INDEXのPARAMETERS句
XMLIndex
索引の作成または変更では、多くの場合、SQL文CREATE INDEX
またはALTER INDEX
でPARAMETERS
句が使用されます。これを使用して、詳細に索引特性を指定できます。
親トピック: XMLTypeデータの索引
XMLIndexの利点
オブジェクト・リレーショナル形式のXMLType
記憶域では、Bツリー索引を効果的に使用できます。基礎となるオブジェクトを直接ターゲット化することで、焦点がより明確に絞られます。ただし、トランスポータブル・バイナリXMLまたはバイナリXMLのいずれかを使用して格納されているXML文書の詳細な構造(要素および属性)を指定する場合、通常は無効です。これはXMLIndex
の特殊ドメインです。
XMLIndex
はドメイン索引で、XMLデータのドメイン用に特化して設計されています。これは論理的索引です。XMLIndex
索引は、SQL/XML関数XMLQuery
、XMLTable
、XMLExists
およびXMLCast
に対して使用できます。
XMLIndexには、他の索引付け方式に比べ、次のような利点があります。
-
XMLIndex
索引は、問合せのどの部分においても効果があります。つまり、WHERE
句での使用に限定されません。これは、XMLデータで使用される他の種類の索引では考えられません。 -
XMLIndex
索引は、XML Schemaに基づく/基づかないにかかわらず、バイナリXMLとして格納されているXMLTypeデータに対して使用できます。Bツリー索引は、オブジェクト・リレーショナル形式で格納されるXML Schemaに基づくデータにのみ適しています。 -
XMLIndex
索引は、コレクション(文書内に複数回出現するノード)をターゲットとするXPath式による検索において使用できます。ファンクション索引の場合とは異なります。 -
問合せに使用されるXPath式が事前にわかっている場合は、頻繁に問合せされる構造化された固定のデータ・アイランドをターゲットとする構造化
XMLIndex
コンポーネントを使用することで、パフォーマンスを向上できます。 -
XMLIndex
索引(索引の作成とメンテナンス)は、複数のデータベース処理により、並列的に実行できます。非推奨になったファンクション索引の場合とは異なります。
親トピック: XMLIndex
XMLIndexコンポーネント
XMLIndexは、構造を持つ可能性のあるXMLデータの索引付けに使用されます。これは、トランスポータブル・バイナリXMLとバイナリXMLの両方として格納されるXMLTypeデータに適用されます。
ノート:
非構造化XML索引は23aiでは非推奨であり、XML検索索引に置き換えられています。Oracleでは、非構造化XML索引をXML検索用索引として再作成し、トランスポータブル・バイナリXMLとともに使用することをお薦めします。
それでも、半構造化XMLデータには、予測可能な構造化データ・アイランドが含まれることがあります。そのため、XMLIndex
索引は、そのようなアイランドの索引付け用の構造化コンポーネントと、ほとんど構造を持たないまたは可変構造のデータの索引付け用の非構造化コンポーネントの2つのコンポーネントを持つことができます。
構造化コンポーネントは、構造化コンテンツのアイランドを投影および使用する問合せで使用すると役立ちます。典型的な例は、作成者、日付およびタイトルの固定フィールドを持つ書式自由の仕様です。非構造化コンポーネントは、XMLフラグメントを抽出する問合せで使用すると役立ちます。1つのXMLIndex
索引に、必ずしも両方のコンポーネントが含まれている必要はありません。
構造化コンポーネントとは異なり、非構造化コンポーネントは汎用的で、比較的ターゲットを限定しません。文書中心のXMLデータの一般的な索引付けに適しています。典型的な例は、1つのXML Webドキュメント、または書籍のうちの1章です。
XMLIndex
索引は、構造化コンポーネントと非構造化コンポーネントのどちらでも作成できます。典型的なユースケースは、構造化データも存在するときは常に文書からXMLフラグメントを抽出するような問合せをサポートする場合などがあります。非構造化コンポーネントは、フラグメントの抽出に使用されます。構造化コンポーネントは、構造化データを確認する問合せ述語(たとえば、SQLのWHERE
句など)に使用されます。
特定のXPathサブセットにのみ適用されるように非構造化コンポーネントを制限することもできますが、そのパス表索引ノードの内容のスカラー型が異なる場合は、異なるデータ型を処理するようにVALUE
列に対して複数の2次索引を作成する必要があることがあります(VALUE列に対する2次索引を参照)。また、非構造化コンポーネントのみを使用した場合、構造化アイランドを投影する問合せに対してプローブやそのパス表の自己結合が何度も行われるために、効率が悪くなることがあります。
一方、構造化コンポーネントは、ほとんど構造を持たない問合せや、XMLフラグメントを抽出する問合せには適していません。構造化データ・アイランドの索引付けには構造化コンポーネントを使用し、ほとんど構造を持たないデータの索引付けには非構造化コンポーネントを使用してください。
最後の行はXMLIndex
がXMLデータの様々なユースケースに適用できるかどうかを示します。XMLIndex
が半構造化XMLデータ(格納されているかどうかに関係なくに)適していることを示します(最後の2列)。構造化コンポーネントでのXMLIndex
索引は、構造化アイランドを含むドキュメント中心データに有用です。
表6-4 XMLのユース・ケースとXML索引付け
データ中心 | 文書中心 | |
---|---|---|
使用例 |
XMLスキーマベースのデータ。時間の経過とともに変化がほとんどなく、構造的な変化もほとんどありません。 |
|
一般的なデータ |
従業員レコード |
|
記憶域モデル |
オブジェクト・リレーショナル(構造化) |
トランスポータブル・バイナリXML |
索引の作成 |
Bツリー索引 |
|
関連項目:
各XMLIndex
コンポーネント・タイプで提供される利点の概要は、XMLIndexの利点参照してください。
親トピック: XMLIndex
XMLIndex構造化コンポーネント
XMLコンテンツの固定の構造化アイランドを投影する問合せに対しては、周囲のデータが比較的構造化されていない場合でも、XMLIndex
索引の構造化コンポーネントを作成して使用します。
構造化XMLIndex
コンポーネントは、このようなアイランドをリレーショナル形式で編成します。この場合、これはSQL/XML関数XMLTable
と類似しており、構造化コンポーネントの定義に使用する構文も類似しています。索引付けデータの格納に使用するリレーショナル表はデータ型を認識し、各列は異なるスカラー・データ型を持つことができます。
したがって、XMLIndex
索引の構造化コンポーネントを作成することは、XMLデータの構造化部分をリレーショナル形式へ分解することと考えることができます。これは、次のような点でXMLType
のオブジェクト・リレーショナル形式の記憶域モデルとは異なります。
-
構造化索引コンポーネントは、指定されたデータの特定の部分(頻繁に問い合せる部分)を明示的に分解します。オブジェクト・リレーショナル形式の
XMLType
記憶域の場合は、XMLType
表または列全体が自動的に分解されます。 -
XMLIndex
索引の構造化コンポーネントは、XML Schemaに基づくデータにもXML Schemaに基づかないデータにも適用できます。オブジェクト・リレーショナル形式のXMLType
記憶域は、XML Schemaに基づくデータにのみ適用できます。 -
構造化
XMLIndex
コンポーネントに対して分解されたデータは、XMLType
データ自体の記憶域モデルとしてではなく索引として、XMLType
データとともに格納されます。 -
構造化
XMLIndex
コンポーネントに対しては、同じデータを、データ型が異なる列として何度も投影できます。
XMLIndex
索引の構造化コンポーネントに使用する索引コンテンツ表は索引の一部ですが、通常のリレーショナル表なので、標準的なリレーショナル索引(主キーおよび外部キー制約を満たす索引を含む)を使用すれば、これらの表にも索引を作成できます。また、Oracle Text CONTEXT
索引などのドメイン索引を使用して索引を作成することもできます。
また、XMLIndex
索引の構造化コンポーネントは、汎化ファンクション索引として考えることもできます。ファンクション索引は、リレーショナル列を1つのみ持つ構造化XMLIndex
コンポーネントのようなものです。
特定のアプリケーションに対して複数のファンクション索引を作成することを予定している場合、かわりに構造化コンポーネントを持つXMLIndex
索引の使用を検討してください。また、構造化索引コンポーネントの列にBツリー索引も作成します。
ノート:
-
SQL/XML関数
XMLTable
を使用する問合せは通常、XMLIndex
構造化コンポーネントのリレーショナル索引付け表を使用するように自動的にリライトすることができます。特に、SQLのORDER BY
、GROUP BY
、およびXMLTable
仮想表の列を操作するウィンドウ構造体が、構造化されたXMLIndex
コンポーネントのリレーショナル索引付け表の実際の列を操作する同じ構造体にリライトされます。XMLIndex
構造化索引付けに使用されるリレーショナル表には、システム定義の内部列も含まれています。これらの内部列は将来的に変更される可能性があるため、その存在や内容を前提とするようなコードは記述しないでください。 -
SQL
TABLE
コレクション式内のOracle SQL関数XMLSequence
(TABLE(XMLSequence(...))
)を使用する問合せは、XMLIndex構造化コンポーネントの索引付け表を使用するようにリライトされません
。Oracle SQL関数XMLSequence
は、Oracle Database 11gリリース2で非推奨になりました。かわりに、標準のSQL/XML関数XMLTable
を使用してください。SQL
TABLE
コレクション式の詳細は、Oracle Database SQL言語リファレンスを参照してください。
- 透過的な索引コンテンツ表の無視
XMLIndex
構造化コンポーネントの索引コンテンツ表は通常のリレーショナル表ですが、読取り専用の表でもあるため、表の列を追加または削除したり、表の行を変更(挿入、更新または削除)したりすることはできません。 - XMLIndex構造化コンポーネントのデータ型に関する考慮事項
XMLIndex
構造化コンポーネントに使用されるリレーショナル表では、SQLデータ型が使用されます。問合せ内で使用されるXQuery式では、XMLデータ型(XML Schemaデータ型およびXQueryデータ型)が使用されます。 - パーティション交換とXMLIndex
パーティション交換では、1つの表と、別の表のパーティションを交換します。最初の表には、交換対象となる2番目の表のパーティションと同じ構造が含まれている必要があります。2つの表はXMLIndex
索引による索引付けという点でも類似している必要があります。
親トピック: XMLIndex
透過的な索引コンテンツ表の無視
XMLIndex
構造化コンポーネントの索引コンテンツ表は通常のリレーショナル表ですが、読取り専用の表でもあるため、表の列を追加または削除したり、表の行を変更(挿入、更新または削除)したりすることはできません。
したがって、通常はリレーショナル索引コンテンツ表は無視してかまいません。DESCRIBE
したり、(2次)索引を作成する以外、それらにアクセスできません。それらに関する統計を明示的に収集する必要はありません。XMLIndex
索引自体、またはXMLIndex
索引が定義されている実表に関する統計のみ収集する必要があります。索引コンテンツ表に関する統計は透過的に収集され保持されます。
親トピック: XMLIndex構造化コンポーネント
XMLIndex構造化コンポーネントのデータ型に関する考慮事項
XMLIndex
構造化コンポーネントに使用されるリレーショナル表では、SQLデータ型が使用されます。問合せ内で使用されるXQuery式では、XMLデータ型(XML Schemaデータ型およびXQueryデータ型)が使用されます。
一貫性や型チェックを保証するために、XQueryの入力規則の部分式のデータ型が自動的に変わることがあります。たとえば、XPath式/PurchaseOrder/LineItem[@ItemNumber = 25]
を使用して問合せされる文書がXML Schemaに基づいていない場合、部分式@ItemNumber
は型なしとなり、XQueryの比較演算子=
によって自動的にxs:double
にキャストされます。XMLIndex
構造化コンポーネントを使用してこのデータに索引を作成するには、SQLデータ型としてBINARY_DOUBLE
を使用する必要があります。
これは通例です。構造化コンポーネントを含むXMLIndex
索引を問合せに適用するには、データ型が対応している必要があります。表6-5に、対応するデータ型を示します。
表6-5 XMLIndexでのXMLデータ型とSQLデータ型の対応
XMLデータ型 | SQLデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ノート:
XMLデータ型がxs:date
またはxs:dateTime
の場合、索引を作成する問合せ対象のデータにタイムゾーン・コンポーネントが含まれていないことがわかっていれば、SQLデータ型DATE
またはTIMESTAMP
を使用するとパフォーマンスを高めることができます。データにタイムゾーン・コンポーネントが含まれている可能性がある場合は、SQLデータ型TIMESTAMP WITH TIMEZONE
を使用する必要があります。
対象となるXMLデータ型とSQLデータ型に1対1の組込みの対応関係がない場合は、問合せに対して索引が取得されるように、(表6-5に従って)両者を対応させる必要があります。これには、次の2つの方法があります。
-
索引を問合せに対応させる–構造化索引コンポーネント内の列を、XMLデータ型と対応するように定義(または再定義)します。たとえば、索引付けの対象となる問合せにXMLデータ型
xs:double
を使用するには、対応するSQLデータ型BINARY_DOUBLE
を使用するように索引を定義します。 -
問合せを索引に対応させる–問合せ内で、XQuery式の関連部分を、索引コンテンツ表に使用するSQLデータ型と対応するデータ型に明示的にキャストします。
例6-1および例6-2に、問合せ内でXQuery式をキャストして、索引コンテンツ表に使用するSQLデータ型に一致させる方法を示します。
この2つの例では、数字25
はどちらも受注品目番号ですが、それぞれ異なる役割を果しています。例6-1では25
はデータ型INTEGER
のSQL数値であり、例6-2では25
はデータ型xs:decimal
のXQuery数値です。
例6-1では、XMLQuery
の結果がSQLのINTEGER
型にキャストされ、SQLの値25と比較されます。例6-2では、属性ItemNumber
の値がXMLデータ型xs:decimal
に(XQuery内で)キャストされます。これはXQueryの値25と比較され、索引に使用されるSQLデータ型(INTEGER
)に対応します。このように、この例では2つの異なる種類のデータ型の変換が行われますが、どちらも型が索引コンテンツ表と一致するように問合せデータが変換されます。
関連項目:
XML Schemaデータ型とSQLデータ型の組込みの対応関係の詳細は、DBMS_XMLSCHEMAを使用したXML Schemaデータ型のSQLデータ型へのマッピングを参照してください。
例6-1 問合せデータと索引データを対応させる – SQLのキャスト
SELECT count(*) FROM purchaseorder WHERE XMLCast(XMLQuery('$p/PurchaseOrder/LineItem/@ItemNumber' PASSING OBJECT_VALUE AS "p" RETURNING CONTENT) AS INTEGER) = 25;
例6-2 問合せデータと索引データを対応させる – XQueryのキャスト
SELECT count(*) FROM purchaseorder
WHERE XMLExists('$p/PurchaseOrder/LineItem[xs:decimal(@ItemNumber) = 25]'
PASSING OBJECT_VALUE AS "p");
親トピック: XMLIndex構造化コンポーネント
パーティション交換とXMLIndex
パーティション交換では、1つの表と、別の表のパーティションを変更します。最初の表には、交換対象となる2番目の表のパーティションと同じ構造が含まれている必要があります。2つの表はXMLIndex
索引による索引付けという点でも類似している必要があります。
次の条件の1つに該当している必要があります。
-
どちらの表にも
XMLIndex
索引がないこと。 -
どちらにも
XMLIndex
索引があり、次のいずれかが当てはまること。-
どちらの索引にも構造化コンポーネントがない。
-
どちらの索引にも構造化コンポーネントがある。
-
これらの条件のいずれも当てはまらない場合、パーティション交換は実行できません。
どちらの表でも構造化コンポーネントにXMLIndex
索引がある場合は、通常、ALTER TABLE EXCHANGE PARTITION
を呼び出す前に一定の前処理を実行する必要があり、呼出し後にも一定の後処理を実行する必要があります。そうしないと、exchange-partition操作でエラーが発生します。
この前処理と後処理を実行するには、例6-3のようにパッケージDBMS_XMLSTORAGE_MANAGE
のPL/SQLプロシージャexchangePreProc
とexchangePostProc
を使用します。XMLType
の各表、table
とexchange_table
には、構造化コンポーネントを持つXMLIndex
索引があります。
参照パーティション表の特殊なケースでは、外部キー制約が関連するため、状況は少し複雑になります。この場合、PL/SQLプロシージャrefPartitionExchangeIn
またはrefPartitionExchangeOut
をそれぞれ使用して、データをパーティション表にロード(exchange-in)またはパーティション表からロード(exchange-out)します。
例6-4では、交換対象の表parent_ex
およびchild_ex
から実表parent
およびchild
にデータをロードし、これを示します。例6-5に、表と索引の定義を示します。
関連項目:
-
ドメイン索引(
XMLIndex
はドメイン索引)を持つ表でのALTER TABLE EXCHANGE PARTITION
の使用方法の詳細は、Oracle Databaseデータ・カートリッジ開発者ガイドを参照してください。 -
パッケージ
DBMS_XMLSTORAGE_MANAGE
のプロシージャexchangePreProc
、exchangePostProc
、refPartitionExchangeIn
およびrefPartitionExchangeIOut
の詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。
例6-3 XMLIndex構造化コンポーネントを持つ表のパーティション交換
EXEC DBMS_XMLSTORAGE_MANAGE.exchangePreProc(USER, 'table'); EXEC DBMS_XMLSTORAGE_MANAGE.exchangePreProc(USER, 'exchange_table'); ALTER TABLE table EXCHANGE PARTITION partition WITH TABLE exchange_table WITH VALIDATION UPDATE INDEXES; EXEC DBMS_XMLSTORAGE_MANAGE.exchangePostProc(USER, 'table'); EXEC DBMS_XMLSTORAGE_MANAGE.exchangePostProc(USER, 'exchange_table');
例6-4 XMLIndexを使用する参照パーティション表のパーティション交換
この例の各要素の意味は次のとおりです。
-
parent
は、パーティション実表です。 -
child
は、XMLType
列xcol
を含む子の参照パーティション表です。 -
child_xidx
は、表child
の列xcol
に定義された構造化コンポーネントを含むXMLIndex
索引です。これは、パーティション化されたローカル索引です。 -
parent_ex
は、実表parent
の交換対象の表です。 -
child_ex
は、子表child
の交換対象の表です。 -
child_xidx_ex
は、表child_ex
の列xcol
に定義された構造化されたコンポーネントを含むXMLIndex
索引です。これは、(索引child_xidx
の場合とは異なり)ローカル索引ではありません。 -
USER
は、表の所有者(データベース・スキーマ)です。
この例ではexchange-in操作を実行して、交換対象の表からパーティション表にデータをロードします。パーティション表から交換対象の表にデータをロードするexchange-out操作は、同じ操作のように見えますが、かわりにプロシージャrefPartitionExchangeOut
を使用することが異なります。このプロシージャに、関連する表と必要なALTER TABLE
... EXCHANGE
文が渡されます。
EXEC DBMS_XMLSTORAGE_MANAGE.refPartitionExchangeIn(
USER, 'parent', 'child', 'parent_ex', 'child_ex',
'ALTER TABLE parent EXCHANGE PARTITION part_all WITH TABLE parent_ex
INCLUDING INDEXES WITH VALIDATION UPDATE INDEXES',
'ALTER TABLE child EXCHANGE PARTITION part_all WITH TABLE child_ex
INCLUDING INDEXES WITH VALIDATION UPDATE INDEXES');
例6-5 参照パーティション表のパーティション交換の例で使用されるデータ
この例は、例6-4で使用される表と索引の作成操作を示しています。
CREATE TABLE parent (id NUMBER PRIMARY KEY,
created DATE)
PARTITION BY RANGE (created)
(PARTITION part_2014 VALUES LESS THAN (to_date('01-jan-2015', 'dd-mon-yyyy')),
PARTITION part_all VALUES LESS THAN (maxvalue));
CREATE TABLE child (parent_id NUMBER NOT NULL,
xcol XMLType,
CONSTRAINT child_tab_fk FOREIGN KEY (parent_id)
REFERENCES parent (id)
ENABLE VALIDATE)
XMLType COLUMN xcol STORE AS BINARY XML PARTITION BY REFERENCE (child_tab_fk);
CREATE INDEX child_xidx ON child p (xcol) INDEXTYPE IS XDB.XMLIndex
PARAMETERS ('XMLTable po_index_tab ''purchaseorder''
COLUMNS pid NUMBER(4) PATH ''@id''') LOCAL ;
CREATE TABLE parent_ex (id NUMBER PRIMARY KEY,
created DATE);
CREATE TABLE child_ex (parent_id NUMBER NOT NULL,
xcol XMLType,
CONSTRAINT child_tab_fk1 FOREIGN KEY (parent_id)
REFERENCES parent_ex(id)
ENABLE VALIDATE)
XMLType COLUMN xcol STORE AS BINARY XML;
CREATE INDEX child_ex_xidx ON child_ex p (xcol) INDEXTYPE IS XDB.XMLIndex
PARAMETERS ('XMLTable po_index_tab_ex ''purchaseorder''
COLUMNS pid NUMBER(4) PATH ''@id''');
親トピック: XMLIndex構造化コンポーネント
XMLIndex索引の作成、削除、変更、および検証
XMLIndex
索引に対する基本操作には、XMLIndex索引の作成、削除、変更および検証が含まれます。例を示します。
ノート:
非構造化XML索引は23aiでは非推奨であり、XML検索索引に置き換えられています。Oracleでは、非構造化XML索引をXML検索用索引として再作成することをお奨めします。
例6-6に示すように、索引タイプをXDB.XMLIndex
と宣言して、XMLIndex
索引を作成します。
これにより、XMLType
のpo_binxml
表に、po_xmlindex_ix
という名前のXMLIndex
索引が作成されます。索引に含まれるのは非構造化コンポーネントのみで、構造化コンポーネントは含まれません。
XMLIndex
索引に構造化コンポーネントを含めるように指定するには、PARAMETERS
句にstructured_clause
を含めます。非構造化コンポーネントを含めるように指定するには、PARAMETERS
句にpath_table_clause
を含めます。
この操作は、XMLIndex
索引を作成または変更する場合に可能です。例6-6に示すように、structured_clause
とpath_table_clause
のいずれも指定しない場合は、非構造化コンポーネントのみが含まれます。
XMLIndex
索引に非構造化コンポーネントと構造化コンポーネントの両方が含まれる場合は、ALTER INDEX
を使用していずれかのコンポーネントを削除できます。
例6-7に示すように、特定のXMLType
表(または列)のXMLIndex
索引の名前を取得できます。また、適宜DBA_INDEXES
またはALL_INDEXES
からINDEX_NAME
を選択することも可能です。
例6-8に示すように、XMLIndex
索引は、他の索引と同様に名前変更または削除できます。この名前変更では、XMLIndex
索引の名前のみが変更されます。この処理ではパス表の名前は変更されません。パス表は、個別に名前を変更できます。
同様に、REBUILD
などのALTER INDEX
オプションを使用し、他の索引プロパティも変更できます。この点においては、XMLIndex
も他の索引タイプと同じです。
XMLIndex
のALTER INDEX
文のRENAME
句は、XMLIndex
そのものに対してのみ適用されます。パス表および2次索引の名前を変更するには、これらのオブジェクトの名前を決定し、適切なALTER TABLE
文またはALTER INDEX
文を直接使用する必要があります。同様に、2次索引の物理プロパティを取得したり、他のなんらかの方法で変更を加えたりする場合は、例C-6の方法に従って2次索引の名前を取得する必要があります。
例6-6 XMLIndex索引の作成
CREATE INDEX po_xmlindex_ix ON po_binxml (OBJECT_VALUE) INDEXTYPE IS XDB.XMLIndex;
例6-7 特定の表にあるXMLIndex索引の名前の取得
SELECT INDEX_NAME FROM USER_INDEXES
WHERE TABLE_NAME = 'PO_BINXML' AND ITYP_NAME = 'XMLINDEX';
INDEX_NAME
---------------
PO_XMLINDEX_IX
1 row selected.
例6-8 XMLIndex索引の名前変更と削除
ALTER INDEX po_xmlindex_ix RENAME TO new_name_ix;
DROP INDEX new_name_ix;
親トピック: XMLIndex
構造化コンポーネントを含むXMLIndexの使用
XMLIndex
構造化コンポーネントにより、XMLデータ内の構造の特定のアイランドを索引付けします。
XMLIndex
索引に構造化コンポーネントを含めるには、XMLIndex
索引の作成または変更時に、PARAMETERS
句でstructured_clause
を使用します。structured_clause ::=を参照してください。
structured_clause
では、索引付けの対象となる構造化アイランドを指定します。キーワードGROUP
を使用して、各構造化アイランドを指定します。このためアイランドの構文は構造グループに一致します。明示的にグループを指定しない場合、事前定義済グループDEFAULT_GROUP
が使用されます。ALTER INDEX
の場合、GROUP
キーワードの前に変更操作キーワードを指定します。新しいグループ(アイランド)を作成する場合はADD_GROUP
を、グループを削除する場合はDROP_GROUP
を指定します。
単に複数のXMLIndex
索引を使用するのではなく、1つの索引内で複数のグループを使用する理由を考えてみます。その理由は、XMLIndex
がドメイン索引であること、そして特定のデータベース列に対しては特定タイプのドメイン索引を1つしか作成できないことです。
構造グループを定義する(つまり、構造化アイランドに索引を作成する)ための構文は、SQL/XML関数XMLTable
を起動するための構文と似ています。リレーショナル列を定義するにはキーワードXMLTable
およびCOLUMNS
を使用し、コレクションを処理するにはXMLTable
のマルチレベル連鎖を使用します。このような索引を簡単に作成するには、PL/SQL関数DBMS_XMLSTORAGE_MANAGE.getSIDXDefFromView
を使用すれば、索引の作成に必要なXMLTable
式を正確に記述できます。
- XMLIndex構造化コンポーネントでの名前空間とStorage句の使用
構造化コンポーネントを持つXMLIndex
索引を作成するとき、使用するXML名前空間と記憶域オプションを指定できます。 - XMLIndex索引への構造化コンポーネントの追加
ALTER INDEX
を使用して、既存のXMLIndex
索引に構造化コンポーネントを追加できます。 - XMLIndex構造化コンポーネントでの非ブロック・モードによるALTER INDEXの使用
XMLIndex
索引の構造化コンポーネントにグループまたは列を追加する際に、ALTER INDEX
によるブロックを回避できるため、この索引を使用する問合せでは、待機する必要はありません。 - 構造化XMLIndexコンポーネントのデータ型の変更
データの一部が構造化XMLIndex
コンポーネントの対応する列で使用されているデータ型と一致しないためにエラーが発生する場合は、キーワードMODIFY_COLUMN_TYPE
をALTER INDEX
に渡すことによって、索引を簡単に変更できることがあります。 - XMLIndex構造化コンポーネントの削除
XMLIndex
索引に非構造化コンポーネントと構造化コンポーネントの両方が含まれる場合は、ALTER INDEX
を使用して構造化コンポーネントを削除できます。これを行うには、構造化コンポーネントを構成するすべての構造グループを削除します。 - 構造化XMLIndexコンポーネントのリレーショナル表への索引付け
XMLIndex
索引の構造化コンポーネントに使用する表は通常のリレーショナル表であるため、標準的な任意のリレーショナル索引を使用して、これらの表に索引付けできます。
関連項目:
-
DBMS_XMLSTORAGE_MANAGE.getSIDXDefFromView
の使用方法の詳細は、リレーショナル・ビューを使用して公開されたバイナリXMLデータの索引付けを参照してください。 -
XMLTable
句のXMLType
列の詳細は、XMLIndex_xmltable_clauseの使用を参照してください。 -
キーワード
COLUMNS
およびVIRTUAL
の詳細は、column_clauseの使用を参照してください。
親トピック: XMLIndex
XMLIndex構造化コンポーネントでの名前空間とStorage句の使用
構造化コンポーネントを持つXMLIndex
索引を作成するとき、使用するXML名前空間と記憶域オプションを指定できます。
例6-9に、XMLIndex
索引の作成を示します。この索引には、構造化コンポーネントのみが含まれ(パス表句は含まれない)、XMLNAMESPACES
句を使用して名前空間を指定します。索引データを圧縮し、表領域USERTBS1
を使用することを指定します。この例では、XML Schemaに基づかないデータを含むバイナリXML表po_binxml
を想定しています。
例6-9に示した(同一の)各TABLESPACE
句は、表レベル(po_ptab
表およびli_tab
表)で適用されます。
一般的に、記憶域オプションは表レベルとパーティション・レベルの両方で指定できます。パーティション・レベルでの指定により、表レベルでの指定がオーバーライドされます。TABLESPACE
句は索引レベルで指定することもできるため、その索引に使用されているすべてのパーティションと表に適用されます。TABLESPACE
が複数のレベルで指定されている場合、パーティション・レベルにより表レベルがオーバーライドされ、表レベルにより索引レベルがオーバーライドされます。
例6-10では、索引で使用されている各表に同じTABLESPACE
を指定します。例6-10に示すように、TABLESPACE
を索引レベルで指定することで、この共通点を取り除くことができます。
例6-9 名前空間および記憶域オプションを使用した、構造化コンポーネントを含むXMLIndex
CREATE INDEX po_struct ON po_binxml (OBJECT_VALUE) INDEXTYPE IS XDB.XMLIndex
PARAMETERS ('XMLTable po_ptab
(TABLESPACE "USERTBS1" COMPRESS FOR OLTP)
XMLNAMESPACES (DEFAULT ''http://www.example.com/po''),
''/purchaseOrder''
COLUMNS orderdate DATE PATH ''@orderDate'',
id BINARY_DOUBLE PATH ''@id'',
items XMLType PATH ''items/item'' VIRTUAL
XMLTable li_tab
(TABLESPACE "USERTBS1" COMPRESS FOR OLTP)
XMLNAMESPACES (DEFAULT ''http://www.example.com/po''),
''/item'' PASSING items
COLUMNS partnum VARCHAR2(15) PATH ''@partNum'',
description CLOB PATH ''productName'',
usprice BINARY_DOUBLE PATH ''USPrice'',
shipdat DATE PATH ''shipDate''');
例6-10 TABLESPACEを索引レベルで指定した、構造化コンポーネントを含むXMLIndex
CREATE INDEX po_struct ON po_binxml (OBJECT_VALUE) INDEXTYPE IS XDB.XMLIndex
PARAMETERS ('XMLTable po_ptab,
XMLNAMESPACES (DEFAULT ''http://www.example.com/po''),
''/purchaseOrder''
COLUMNS orderdate DATE PATH ''@orderDate'',
id BINARY_DOUBLE PATH ''@id'',
items XMLType PATH ''items/item'' VIRTUAL
XMLTable li_tab,
XMLNAMESPACES (DEFAULT ''http://www.example.com/po''),
''/item'' PASSING items
COLUMNS partnum VARCHAR2(15) PATH ''@partNum'',
description CLOB PATH ''productName'',
usprice BINARY_DOUBLE PATH ''USPrice'',
shipdat DATE PATH ''shipDate''
TABLESPACE "USERTBS1" COMPRESS FOR OLTP)');
親トピック: 構造化コンポーネントを含むXMLIndexの使用
XMLIndex索引への構造化コンポーネントの追加
ALTER INDEX
を使用して、既存のXMLIndex
索引に構造化コンポーネントを追加できます。
例6-11に、非構造化コンポーネントのみを含むXMLIndex
索引を作成する方法を示します。PARAMETERS
句でパス・ノードに明示的に名前付けしているため、非構造化コンポーネントが作成されます。
例6-11では、ALTER INDEX
を使用して、po_item
という名前の構造化コンポーネント(グループ)を追加します。この構造グループには、キーワードXMLTable
で指定された2つのリレーショナル表が含まれます。
最上位の表po_idx_tab
には、reference
、requestor
、username
およびlineitem
の列があります。lineitem
列の型はXMLType
です。この列はコレクションを表しているため、2番目のXMLTable
構造体に渡されて、2番目のレベルのリレーショナル表po_index_lineitem
を構成します。この表には、列itemno
、description
、partno
、quantity
およびunitprice
が含まれます。
XMLType
列にはキーワードVIRTUALが必要
です。このキーワードは、XMLType
列自体が生成されないことを指定します。つまり、そのデータは、対応するXMLTable
表により指定されたリレーショナル列の形式でのみ、XMLIndex
索引に格納されます。
1つのXMLTable
内に複数のXMLType
列を作成することはできません。1つのXMLTable内に複数のXMLType列を入れる場合は、追加のグループを定義する必要があります。
例6-11にも、PARAMETERS
句での登録済パラメータ文字列の使用を示します。これはPL/SQLのプロシージャDBMS_XMLINDEX.registerParameter
を使用して、myparam
という名前のパラメータ文字列を登録します。次にALTER INDEX
を使用して、文字列myparam
に含まれるように索引パラメータを更新します。
例6-11 XMLIndex索引: 構造化コンポーネントの追加
CREATE INDEX po_xmlindex_ix ON po_binxml (OBJECT_VALUE)
INDEXTYPE IS XDB.XMLIndex PARAMETERS ('PATH TABLE path_tab');
BEGIN
DBMS_XMLINDEX.registerParameter(
'myparam',
'ADD_GROUP GROUP po_item
XMLTable po_idx_tab ''/PurchaseOrder''
COLUMNS reference VARCHAR2(30) PATH ''Reference'',
requestor VARCHAR2(30) PATH ''Requestor'',
username VARCHAR2(30) PATH ''User'',
lineitem XMLType PATH ''LineItems/LineItem'' VIRTUAL
XMLTable po_index_lineitem ''/LineItem'' PASSING lineitem
COLUMNS itemno BINARY_DOUBLE PATH ''@ItemNumber'',
description VARCHAR2(256) PATH ''Description'',
partno VARCHAR2(14) PATH ''Part/@Id'',
quantity BINARY_DOUBLE PATH ''Part/@Quantity'',
unitprice BINARY_DOUBLE PATH ''Part/@UnitPrice''');
END;
/
ALTER INDEX po_xmlindex_ix PARAMETERS('PARAM myparam');
親トピック: 構造化コンポーネントを含むXMLIndexの使用
XMLIndex構造化コンポーネントでの非ブロック・モードによるALTER INDEXの使用
XMLIndex
索引の構造化コンポーネントにグループまたは列を追加する際に、ALTER INDEX
によるブロックを回避できるため、この索引を使用する問合せでは、待機する必要はありません。
ALTER INDEX
を使用して、XMLIndex
索引の構造化コンポーネントにグループまたは列を追加する場合、この索引メンテナンス操作では、実表および索引に対して排他DDLロックを取得します。
ALTER INDEX
操作が終了するまで、実表はDML操作に対してロックされ、索引を問合せで使用することはできません。つまり、この索引メンテナンス中は、実表に対して問合せやDML操作を実行する別のセッションから索引を使用することはできません。ALTER INDEX
操作とそれに附随するロックの期間は、XMLType
の実列に含まれているデータ量によって異なります。
この問題を回避するには、次の手順を実行します。
-
構造化コンポーネントのグループまたは列を作成する
ALTER INDEX
文のPARAMETERS
句で、ADD_GROUP
またはADD_COLUMN
の前にキーワードNONBLOCKING
を指定します。これにより、必要に応じて索引は更新されますが、実表のデータは索引付けされません。実表のデータに依存しないため、実表のサイズに関係なく高速です。
-
PL/SQLプロシージャ
DBMS_XMLINDEX.
process_pending
を呼び出します。このプロシージャでは、キーワード
NONBLOCKING
が指定されていないかのように、実表の行に索引付けして索引の表にデータを移入します。ただし、この場合、処理および変更のコミットが行われている間にロックされる行はわずか数行です。他の目的ですでにロックされていた行はスキップされます。これにより、ロック競合が大幅に減少し、一部の行への索引付けを可能にしつつ、同時に、その他の行に対して問合せやDML操作を実行できます。プロシージャ
process_pending
が終了すると、次のOUT
パラメータを戻します。-
索引付けできなかった行の数。この原因は、それらが他の目的でロックされていたか、エラーが発生したためかのいずれかです(この数には、もう1つの
OUT
パラメータとして戻された数も含みます)。これらのロックが解除されたことを確認した後で、プロシージャ
process_pending
をもう一度呼び出して、保留中の行の処理を試みます。 -
エラーが発生したために索引付けできなかった行の数(これはまれなケースです)。
表
SYS_AIXSXI_
index_number
_ERRORTAB
でエラーの詳細を確認し、問題の原因を解決するための処置を取ります。index_number
とは、索引オブジェクト番号のことです。
-
-
すべての行が正常に索引付けされたことをプロシージャprocess_pendingが示すか、解決できない問題が発生して索引付けの操作を完全にキャンセルする判断をユーザーが下すまで、ステップ
2
を必要な回数繰り返します。同じ
XMLIndex
索引に対し、別のALTER INDEX
文のPARAMETERS
句で、キーワードNONBLOCKING ABORT
を指定することにより、索引付けは(ステップ2の前に)いつでもキャンセルできます。 -
すべての行が正常に索引付けされた場合は、同じ
XMLIndex
索引に対して、別のALTER INDEX
文のPARAMETERS
句で、キーワードNONBLOCKING COMPLETE
を指定します。
例6-12に、これを示します。
表SYS_AIXSXI_
index_number
_
ERRORTAB
がエラーをレポートするように、表SYS_AIXSXI_
index_number
_
PENDINGTAB
には、索引の有無に関係なく、実表の行ごとに現在のステータスが記録されます。何か他の目的で行がロックされているか、索引付けを試みてエラーが発生したために、まだ索引付けされていない行がある場合があります。後者の場合は、SYS_AIXSXI_
index_number
_ERRORTAB
を参照して、エラーの詳細を確認してください。
例6-12 DBMS_XMLINDEX.PROCESS_PENDINGを使用したXMLデータの索引付け
CREATE INDEX po_struct ON po_binxml (OBJECT_VALUE) INDEXTYPE IS XDB.XMLIndex PARAMETERS ('XMLTable po_idx_tab ''/PurchaseOrder'' COLUMNS reference VARCHAR2(30) PATH ''Reference'', requestor VARCHAR2(30) PATH ''Requestor'', username VARCHAR2(30) PATH ''User'', lineitem XMLType PATH ''LineItems/LineItem'' VIRTUAL XMLTable po_index_lineitem ''/LineItem'' PASSING lineitem COLUMNS itemno BINARY_DOUBLE PATH ''@ItemNumber'', description VARCHAR2(256) PATH ''Description'', partno VARCHAR2(14) PATH ''Part/@Id'', quantity BINARY_DOUBLE PATH ''Part/@Quantity'', unitprice BINARY_DOUBLE PATH ''Part/@UnitPrice'''); ALTER INDEX po_struct PARAMETERS('NONBLOCKING ADD_GROUP GROUP po_action_group XMLTABLE po_idx_tab ''/PurchaseOrder'' COLUMNS actions XMLType PATH ''Actions/Action'' VIRTUAL XMLTABLE po_idx_action ''/Action'' PASSING actions COLUMNS actioned_by VARCHAR2(10) PATH ''User'', date_actioned TIMESTAMP PATH ''Date'''); DECLARE num_pending NUMBER := 0; num_errored NUMBER := 0; BEGIN DBMS_XMLINDEX.process_pending('oe', 'po_struct', num_pending, num_errored); DBMS_OUTPUT.put_line('Number of rows still pending = ' || num_pending); DBMS_OUTPUT.put_line('Number of rows with errors = ' || num_errored); END; / Number of rows still pending = 0 Number of rows with errors = 0 PL/SQL procedure successfully completed. ALTER INDEX po_struct PARAMETERS('NONBLOCKING COMPLETE');
親トピック: 構造化コンポーネントを含むXMLIndexの使用
構造化XMLIndexコンポーネントのデータ型の変更
データの一部が構造化XMLIndex
コンポーネントの対応する列で使用されているデータ型と一致しないためにエラーが発生する場合は、キーワードMODIFY_COLUMN_TYPE
をALTER INDEX
に渡すことによって、索引を簡単に変更できることがあります。
たとえば、VARCHAR2(30)
列にデータを40文字まで収容する必要がある場合は、それをVARCHAR2(40)
などに拡張できます。列を削除してから新しい列を追加するよりも、この方が簡単でより効率的です。ただし、ALTER TABLE MODIFY COLUMN
と同じ制約が適用されるので、新旧のデータ型が一致している必要があります。
関連項目:
-
ALTER TABLE MODIFY COLUMN
の詳細は、Oracle Database SQL言語リファレンスを参照してください。
親トピック: 構造化コンポーネントを含むXMLIndexの使用
XMLIndex構造化コンポーネントの削除
XMLIndex
索引に非構造化コンポーネントと構造化コンポーネントの両方が含まれる場合は、ALTER INDEX
を使用して構造化コンポーネントを削除できます。これを行うには、構造化コンポーネントを構成するすべての構造グループを削除します。
例6-13 XMLIndex構造化コンポーネントの削除
ALTER INDEX po_xmlindex_ix PARAMETERS('DROP_GROUP GROUP po_item');
親トピック: 構造化コンポーネントを含むXMLIndexの使用
構造化XMLIndexコンポーネントのリレーショナル表への索引付け
XMLIndex
索引の構造化コンポーネントに使用する表は通常のリレーショナル表であるため、標準的な任意のリレーショナル索引を使用して、これらの表に索引付けできます。
詳細は、XMLIndex構造化コンポーネントの項を参照してください。例6-14に、これを示します。この例では、例6-11のXMLIndex
索引に対して、索引コンテンツ表(構造化フラグメント)のreference
列にBツリー索引を作成します。
例6-14 XMLIndex索引コンテンツ表に対するBツリー索引の作成
CREATE INDEX idx_tab_ref_ix ON po_idx_tab (reference);
親トピック: 構造化コンポーネントを含むXMLIndexの使用
XMLIndexが使用されるかどうかを判別する方法
特定のXMLIndex
索引が問合せの解決に使用されたかどうかを把握するには、問合せの実行計画を検証します。
特定のXMLIndex
索引を使用できるかどうかは、問合せのコンパイル時にOracle Databaseにより決定されます。つまり、索引に対する問合せにその問合せをリライトできるかどうかによって決まります。
たとえば、索引付けの際にパス/PurchaseOrder/LineItems//*
が含まれる場合、/PurchaseOrder/LineItems/LineItem/Description
を含む問合せでは索引を使用できますが、//Description
を含む問合せは索引を使用できません。後者は、/PurchaseOrder/LineItems
の子ではない潜在的なDescription
要素と一致し、そのDescription
要素がデータに出現するかどうかはコンパイル時に判断できません。
特定のXMLIndex
索引が問合せの解決に使用されたかどうかを把握するには、問合せの実行計画を検証します。
-
索引の構造化コンポーネントが使用される場合、その索引コンテンツ表の1つ以上が実行計画において呼び出されます。 「例 6-15」を参照してください。
CREATE INDEX po_struct ON po_binxml (OBJECT_VALUE) INDEXTYPE IS XDB.XMLIndex
PARAMETERS ('GROUP po_item
XMLTable po_idx_tab ''/PurchaseOrder''
COLUMNS reference VARCHAR2(30) PATH ''Reference'',
requestor VARCHAR2(30) PATH ''Requestor'',
username VARCHAR2(30) PATH ''User'',
lineitem XMLType PATH ''LineItems/LineItem'' VIRTUAL
XMLTable po_index_lineitem ''/LineItem'' PASSING lineitem
COLUMNS itemno BINARY_DOUBLE PATH ''@ItemNumber'',
description VARCHAR2(256) PATH ''Description'',
partno VARCHAR2(14) PATH ''Part/@Id'',
quantity BINARY_DOUBLE PATH ''Part/@Quantity'',
unitprice BINARY_DOUBLE PATH ''Part/@UnitPrice''');
例6-15に、同じXMLIndex
索引が、マルチレベルのXMLTable連鎖を使用する問合せに対して取得されることを示す実行計画を示します。
この実行計画は、リレーショナル索引コンテンツ表po_idx_tab
およびpo_index_lineitem
への直接アクセスを示しています。
例6-15 マルチレベル連鎖を使用する問合せに対する構造化XMLIndexコンポーネントの使用
EXPLAIN PLAN FOR
SELECT po.reference, li.*
FROM po_binxml p,
XMLTable('/PurchaseOrder' PASSING p.OBJECT_VALUE
COLUMNS reference VARCHAR2(30) PATH 'Reference',
lineitem XMLType PATH 'LineItems/LineItem') po,
XMLTable('/LineItem' PASSING po.lineitem
COLUMNS itemno BINARY_DOUBLE PATH '@ItemNumber',
description VARCHAR2(256) PATH 'Description',
partno VARCHAR2(14) PATH 'Part/@Id',
quantity BINARY_DOUBLE PATH 'Part/@Quantity',
unitprice BINARY_DOUBLE PATH 'Part/@UnitPrice') li
WHERE po.reference = 'SBELL-20021009123335280PDT';
-------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 17 | 20366 | 8 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | | | | |
| 2 | NESTED LOOPS | | 17 | 20366 | 8 (0)| 00:00:01 |
| 3 | NESTED LOOPS | | 1 | 539 | 3 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL | PO_IDX_TAB | 1 | 529 | 3 (0)| 00:00:01 |
|* 5 | INDEX UNIQUE SCAN | SYS_C007442 | 1 | 10 | 0 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | SYS86751_86759_PKY_IDX | 17 | | 1 (0)| 00:00:01 |
| 7 | TABLE ACCESS BY INDEX ROWID| PO_INDEX_LINEITEM | 17 | 11203 | 5 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - filter("SYS_SXI_2"."REFERENCE"='SBELL-20021009123335280PDT')
5 - access("P"."SYS_NC_OID$"="SYS_SXI_2"."OID")
6 - access("SYS_SXI_2"."KEY"="SYS_SXI_3"."PKEY")
Note
-----
- dynamic sampling used for this statement
25 rows selected.
親トピック: XMLIndex
XMLIndexの使用の無効化
XMLIndex
の使用を無効にするには、オプティマイザ・ヒント/*+ NO_XML_QUERY_REWRITE */
またはオプティマイザ・ヒント/*+ NO_XMLINDEX_REWRITE */
を使用します。
これらの各ヒントにより、すべてのXMLIndex
索引の使用が無効になります。NO_XML_QUERY_REWRITE
は、XMLIndex
の使用を無効にする他に、XQueryの最適化もすべて無効にします(XMLIndex
はXPathリライトの一部です)。
例6-16に、これらのオプティマイザ・ヒントの使用方法を示します。
ノート:
NO_INDEX
オプティマイザ・ヒントは、XMLIndex
には適用されません。
関連項目:
XQueryの最適化を詳細に管理できるXQueryプラグマora:no_xmlquery_rewrite
およびora:xmlquery_rewrite
の詳細は、「XQueryのオプション機能」を参照してください。
例6-16 オプティマイザ・ヒントを使用したXMLIndexの無効化
SELECT /*+ NO_XMLINDEX_REWRITE */ count(*) FROM po_binxml WHERE XMLExists('$p/*' PASSING OBJECT_VALUE AS "p"); SELECT /*+ NO_XML_QUERY_REWRITE */ count(*) FROM po_binxml WHERE XMLExists('$p/*' PASSING OBJECT_VALUE AS "p");
親トピック: XMLIndex
構造化コンポーネントを含むXMLIndexの使用のガイドライン
構造化コンポーネントを含むXMLIndex
を使用する際に役立つ複数のガイドラインがあります。
-
構造化コンポーネントを含む
XMLIndex
を使用して、リレーショナル列としてXMLデータを投影および索引付けします。ファンクション索引は使用しないでください。XMLとの使用は非推奨です。 -
構造化コンポーネントが含まれる
XMLIndex
索引と問合せの間のデータ型の対応の確認。XMLIndex構造化コンポーネントのデータ型に関する考慮事項を参照してください。 -
XMLType
データに関してリレーショナル・ビューを作成する場合(SQL関数XMLTable
などを使用して)、同じリレーショナル列をターゲットとする、構造化されたコンポーネントを持つXMLIndex
索引を作成することも考慮してください。XMLデータのリレーショナル・ビューを参照してください。 -
フラグメント抽出と値のフィルタリング(検索)の両方に単一のXQuery式を使用するかわりに、
SELECT
句でSQL/XML関数XMLQuery
を使用し、WHERE
句のフラグメントおよびXMLExists
を抽出して値をフィルタリングします。こうすることで、Oracle XML DBがフラグメント抽出の機能的に、あるいはストリーミング評価を使用して評価できます。値のフィルタリングの場合、こうするとOracle XML DBが適切な構造のコンポーネントを持つ
XMLIndex
索引を取得できます。 -
問合せの結果の順序を設定するには、SQLの
ORDER BY
句とSQL/XML関数XMLTable
を使用します。XQueryのorder by
句は使用しないでください。構造化されたコンポーネントを含むXMLIndex
索引を使用する場合は、特に使用を避けてください。
親トピック: XMLIndex
XMLIndexのパーティション化および並列度
レンジ・パーティション化、リスト・パーティション化、またはハッシュ・パーティション化を使用して、XMLType
表や、XMLType
列が含まれる表をパーティション化する場合、その表にXMLIndex
索引を作成することもできます。オプションで、索引の作成とメンテナンスが並列で実行されるようにできます。
索引作成とメンテナンスを確実に並列化するには、XMLIndex
索引を作成または変更するとき、PARALLEL
句を(オプションで)使用します。
XMLIndex
索引を作成するときにキーワードLOCAL
を使用すると、索引とその記憶域表すべてが、実表に関連してローカルに同一レベル・パーティション化されます。
キーワードLOCAL
を使用しない場合は、パーティション化された表にXMLIndex
索引を作成できません。また、コンポジット・パーティション化した表には、XMLIndex
索引を作成できません。
PARALLEL
句を使用しており、実表がパーティション化されていたり、実表で並列度が有効になっている場合は、これによりDML操作(INSERT
、UPDATE
、DELETE
)と索引DDL操作(CREATE
、ALTER
、REBUILD
)の両方のパフォーマンスを向上させることができます。
索引に並列度を指定すると、問合せサーバー・プロセスそれぞれに個別に記憶域パラメータが適用されるため、記憶域の消費も多くなります。たとえば、INITIAL
値が5M、並列度が12で作成された索引は、作成時に少なくとも60Mの記憶域を消費します。
CREATE INDEX
およびALTER INDEX
のPARALLEL句の構文は、他のドメイン索引のものと同じです。
{ NOPARALLEL | PARALLEL [ integer ] }
例6-17では、並列度10でXMLIndex
索引を作成します。実表がパーティション化されている場合、この索引は同一レベル・パーティション化されます。
例6-17では、パス表と2次索引は、XMLIndex
索引そのものと同じ並列度(10)を継承して作成されます。パス表と2次索引に対して個別のPARALLEL
句を使用し、異なる並列度を設定することも可能です。例6-18に、これを示します。ここでも、キーワードLOCAL
により、実表がパーティション化されている場合、この索引は同一レベル・パーティション化されます。
例6-18ではNOPARALLEL
が指定されているため、XMLIndex
索引そのものが連続して作成されます。2次索引po_pikey_ix
も連続で移入されます。これは、2次索引に対して明示的に並列度が指定されておらず、XMLIndex
索引から並列度が継承されるためです。パス表そのものは並列度を10として作成され2次索引値の列po_value_ix
は、明示的な並列度指定を反映し、並列度5として移入されます。
XMLIndex
索引、パス表、またはその2次索引に対して指定した並列度は、後続のDML操作および問合せにおいて使用されます。
XMLIndex
の並列度を指定できる位置は、PARAMETERS
句のカッコ付きの式の中とその後の2箇所です。
関連項目:
CREATE INDEX
のPARALLEL句の詳細は、Oracle Database SQL言語リファレンスを参照してください。
例6-17 XMLIndex索引の並列的な作成
CREATE INDEX po_xmlindex_ix ON sale_info (sale_po_clob)
INDEXTYPE IS XDB.XMLIndex
LOCAL PARALLEL 10;
例6-18 XMLIndexの内部オブジェクトに対する、異なるPARALLEL度の使用
CREATE INDEX po_xmlindex_ix ON sale_info (sale_po_clob)
INDEXTYPE IS XDB.XMLIndex
LOCAL NOPARALLEL PARAMETERS ('PATH TABLE po_path_table (PARALLEL 10)
PIKEY INDEX po_pikey_ix
VALUE INDEX po_value_ix (PARALLEL 5)');
親トピック: XMLIndex
コストベース・オプティマイザに対するXMLIndexオブジェクトの統計の収集
Oracle Databaseのコストベース・オプティマイザにより、使用される索引(ある場合)も含め、所定の問合せをどのように評価すると最も費用効率が高いかが決定します。これを正確に実行するには、様々なデータベース・オブジェクトの統計を収集する必要があります。
ノート:
次は、パッケージDBMS_STATS
内のプロシージャのみに適用され、ANALYZE INDEX
には適用されません。
XMLIndex
については、通常はXMLIndex
索引が定義されている実表に関する統計のみ収集する必要があります(DBMS_STATS.gather_table_stats
プロシージャなどを使用)。これにより、XMLIndex
索引自体、パス表とその2次索引、および構造化コンポーネント・コンテンツ表とその2次索引に関する統計が自動的に収集されます。
実表の統計を削除すると(DBMS_STATS.delete_table_stats
プロシージャを使用)、他のオブジェクトに関する統計も削除されます。同様に、XMLIndex
索引に関する統計を収集すると(DBMS_STATS.gather_index_stats
プロシージャを使用)、パス表とその2次索引、および構造化コンポーネント・コンテンツ表とその2次索引に関する統計も収集されます。
例6-19では、実表po_binxml
に関する統計を収集します。XMLIndex
索引、パス表、および2次パス表索引に関する統計が自動的に収集されます。
関連項目:
XMLIndex
索引の統計情報を記録するデータベース・ビューの詳細は、XMLIndexに関連するデータ・ディクショナリの静的なパブリック・ビューを参照してください。
例6-19 XMLIndexオブジェクトに関する統計の自動収集
CALL DBMS_STATS.gather_table_stats(USER, 'PO_BINXML', ESTIMATE_PERCENT => NULL);
親トピック: XMLIndex
XMLIndexに関連するデータ・ディクショナリの静的なパブリック・ビュー
標準的なデータベース索引に関する情報は、静的なパブリック・ビューUSER_INDEXES
、ALL_INDEXES
、およびDBA_INDEXES
にあります。XMLIndex
索引に関する同様の情報も、静的なパブリック・ビューUSER_XML_INDEXES
、ALL_XML_INDEXES
、およびDBA_XML_INDEXES
にあります。
表6-6で、これらの各ビューの列について説明します。
表6-6 XMLIndexの静的なパブリック・ビュー
列名 | 型 | 説明 |
---|---|---|
|
|
非同期索引の更新の仕様です。XMLIndex索引の非同期(遅延)メンテナンスを参照してください。 |
|
|
パスのサブセット化:
|
|
|
|
|
|
索引の所有者です。 |
|
|
索引のコンポーネントのタイプは、 |
|
|
索引の作成に使用された 構造化コンポーネントが存在する場合、 非構造化 |
|
|
|
|
|
最後に行われた索引の同期以降の、実表のDML操作を記録する表の名前です。XMLIndex索引の非同期(遅延)メンテナンスを参照してください。 |
|
|
索引が定義されている実表の名前です。 |
|
|
索引が定義されている実表の所有者です。 |
これらのビューでは、XMLIndex
索引に関する情報が提供されますが、XMLIndex
索引で収集される統計に関する情報を提供する静的データ・ディクショナリ・ビューはありません。この統計情報は、次のビュー間で配信されます。
-
USER_INDEXES
、ALL_INDEXES
、DBA_INDEXES
– 列LAST_ANALYZED
では、XMLIndex
索引の最終分析日が提供されます。 -
USER_TAB_STATISTICS
、ALL_TAB_STATISTICS
、DBA_TAB_STATISTICS
– 列TABLE_NAME
を使用して、XMLIndex索引に準拠する表を識別できます。これらの表の統計情報を取得するには、XMLTable表の名前をTABLE_NAME
として使用して問い合せます。 -
USER_IND_STATISTICS
、ALL_IND_STATISTICS
、DBA_IND_STATISTICS
– 列INDEX_NAME
では、XMLIndex
索引の2次索引のそれぞれの情報が提供されます。指定された2次索引に関する情報については、その2次索引の名前をINDEX_NAME
として使用して問い合せます。
親トピック: XMLIndex
CREATE INDEXおよびALTER INDEXのPARAMETERS句
XMLIndex
索引の作成または変更では、多くの場合、SQL文CREATE INDEX
またはALTER INDEX
でPARAMETERS
句が使用されます。これを使用して、詳細に索引特性を指定できます。
PARAMETERS
句の1000文字の制限を回避するために、パッケージDBMS_XMLINDEX
内のPL/SQLプロシージャregisterParameter
およびmodifyParameter
を使用できます。
- XMLIndexの登録済パラメータ句の使用
CREATE INDEX
またはALTER INDEX
文のPARAMETERS
句に使用する文字列値には、1000文字の制限があります。この制限を回避するには、パッケージDBMS_XMLINDEX
内のPL/SQLプロシージャregisterParameter
およびmodifyParameter
を使用できます。 - CREATE INDEXおよびALTER INDEXのPARAMETERS句の構文
CREATE INDEX
およびALTER INDEX
のPARAMETERS
句の構文は、定義されています。 - XMLIndex_parameters_clauseの使用
XMLIndex
索引を作成するとき、XMLIndex_parameters_clause
がなければ、新しい索引には非構造化コンポーネントのみが含まれます。XMLIndex_parameters_clause
があってもPARAMETERS
引数が空(''
)の場合、結果は同じであり、索引には非構造化コンポーネントのみが含められます。 - XMLIndex_parameterの使用
XMLIndex_parameters
を使用する場合は、特定の考慮事項が適用されます。 - groups_clauseおよびalter_index_group_clauseの使用
groups_clause
句は、CREATE INDEX
(alter_index_group_clause
句のADD GROUP
の後)でのみ使用されます。alter_index_group_clause
句は、ALTER INDEX
でのみ使用されます。 - XMLIndex_xmltable_clauseの使用
XMLIndex_xmltable_clause
を使用する場合は、特定の考慮事項が適用されます。 - column_clauseの使用
column_clause
を使用する場合は、特定の考慮事項が適用されます。
関連項目:
-
index_attributes
の構文は、Oracle Database SQL言語リファレンスを参照してください。 -
segment_attributes_clause
の構文は、Oracle Database SQL言語リファレンスを参照してください。 -
table_properties
の構文は、Oracle Database SQL言語リファレンスを参照してください。 -
parallel_clause
の構文は、Oracle Database SQL言語リファレンスを参照してください。 -
CREATE INDEX
の構文およびセマンティクスの追加情報は、Oracle Database SQL言語リファレンスを参照してください。 -
ALTER INDEX
の構文およびセマンティクスの追加情報は、Oracle Database SQL言語リファレンスを参照してください。 -
repeat_interval
の構文は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスの「カレンダ構文」の項を参照してください。
親トピック: XMLIndex
XMLIndexの登録済パラメータ句の使用
CREATE INDEX
またはALTER INDEX
文のPARAMETERS
句に使用する文字列値には、1000文字の制限があります。この制限を回避するには、パッケージDBMS_XMLINDEX
内のPL/SQLプロシージャregisterParameter
およびmodifyParameter
を使用できます。
これらのプロシージャごとに、(長さ制限のない)パラメータの文字列と、その文字列の登録に使用する識別子を指定します。次に索引PARAMETERS
句で、リテラル文字列ではなく、キーワードPARAM
で始まる識別子を指定します。
識別子は、CREATE INDEX
またはALTER INDEX
文で使用する前に、登録しておく必要があります。
関連項目:
CREATE INDEXおよびALTER INDEXのPARAMETERS句の構文
CREATE INDEX
およびALTER INDEX
のPARAMETERS
句の構文は、定義されています。
XMLIndex_parameters_clause ::=
XMLIndex_parameters ::=
XMLIndex_parameter_clause ::=
unstructured_clause ::=
create_index_paths_clause ::=
alter_index_paths_clause ::=
namespace_mapping_clause ::=
path_table_clause ::=
pikey_clause ::=
path_id_clause ::=
order_key_clause ::=
value_clause ::=
drop_path_table_clause ::=
parallel_clause ::=
structured_clause ::=
async_clause ::=
groups_clause ::=
group_clause ::=
XMLIndex_xmltable_clause ::=
構文要素XML_namespaces_clauseおよびXQuery_stringは、SQL/XML関数XMLTable
の場合と同じです。
column_clause ::=
構文要素column_clauseは、SQL/XML関数XMLTableのXML_table_column
と似ていますが同じではありません。
alter_index_group_clause ::=
add_column_clause :==
add_column_options :==
構文要素XML_namespaces_clauseは、SQL/XML関数XMLTable
の場合と同じです。Oracle XML DBのXMLTABLE SQL/XML関数を参照してください。
drop_column_clause :==
drop_column_options :==
modify_column_type_clause :==
modify_column_type_options :==
XMLIndex_parameters_clauseの使用
XMLIndex
索引を作成するとき、XMLIndex_parameters_clause
がなければ、新しい索引には非構造化コンポーネントのみが含まれます。XMLIndex_parameters_clause
があってもPARAMETERS
引数が空(''
)の場合、結果は同じであり、索引には非構造化コンポーネントのみが含められます。
ノート:
非構造化XML索引は23aiでは非推奨であり、XML検索索引に置き換えられています。Oracleでは、非構造化XML索引をXML検索用索引として再作成し、トランスポータブル・バイナリXMLとともに使用することをお薦めします。
関連項目:
-
CREATE INDEX
のXMLIndex_parameters_clause
の使用コンテキストの詳細は、Oracle Database SQL言語リファレンスを参照してください。 -
ALTER INDEX
のXMLIndex_parameters_clause
の使用コンテキストの詳細は、Oracle Database SQL言語リファレンスを参照してください。
XMLIndex_parameterの使用
XMLIndex_parameters
を使用する場合は、特定の考慮事項が適用されます。
ノート:
非構造化XML索引は23aiでは非推奨であり、XML検索索引に置き換えられています。Oracleでは、非構造化XML索引をXML検索用索引として再作成し、トランスポータブル・バイナリXMLとともに使用することをお薦めします。
-
XMLIndex_parameters
では、XMLIndex_parameter_clause
を1種類当たり最大1回しか使用できません。たとえば、PATHS
句を最大で1回、path_table_clause
を最大で1回などです。 -
XMLIndex
索引を作成するとき、structured_clause
がなければ、新しい索引には非構造化コンポーネントのみが含められます。structured_clause
が存在すれば、新しい索引には構造化コンポーネントのみが含められます。
groups_clauseおよびalter_index_group_clauseの使用
groups_clause
句は、CREATE INDEX
(alter_index_group_clause
句のADD GROUP
の後)でのみ使用されます。alter_index_group_clause
句は、ALTER INDEX
でのみ使用されます。
XMLIndex_xmltable_clauseの使用
XMLIndex_xmltable_clause
を使用する場合は、特定の考慮事項が適用されます。
-
XMLIndex_xmltable_clause
内のXQuery_string
式では、XQuery関数ora:view
(サポート対象外)、fn:doc
またはfn:collection
を使用できません。 -
特定の
XMLIndex_xmltable_clause
にデータ型XMLType
のcolumn_clause
が複数含まれる場合、Oracle XML DBでエラーが発生します。このような2つの仮想列を定義した場合と同じ結果にするには、個別にgroup_clause
を追加する必要があります。 -
XMLIndex_xmltable_clause
ではPASSING
句はオプションです。この句が存在しない場合、次のようにXMLType
列が暗黙的に渡されます。-
パラメータ句の最初の
XMLIndex_xmltable_clause
では、索引付けされるXMLType
列が暗黙的に渡されます。(XMLType
表に索引を作成する場合、疑似列OBJECT_VALUE
が渡されます。) -
それ以降の各
XMLIndex_xmltable_clause
については、その前のXMLIndex_xmltable_clause
のVIRTUAL
XMLType
列が暗黙的に渡されます。
-
column_clauseの使用
column_clause
を使用する場合は、特定の考慮事項が適用されます。
XMLIndex
索引でXMLTable
のマルチレベル連鎖を使用する場合、あるレベルのXMLTable
表は、その前のレベルのXMLType
列に対応します。構文の説明で、キーワードVIRTUAL
はオプションとして示されています。実際には、これはXMLType
列でのみ使用され、その場合は必須です。XMLType
列以外に使用するとエラーになります。VIRTUAL
は、XMLType
列自体が生成されないことを指定します。つまり、そのデータは、対応するXMLTable
表により指定されたリレーショナル列の形式でのみ、索引に格納されます。
XML検索索引: 全文検索および非定型の問合せの索引付け
トランスポータブル・バイナリXMLとして格納されている大規模な非構造化ドキュメントに対するフルテキスト検索または範囲検索機能が必要な場合は、OracleではXML検索索引を使用してXMLデータを索引付けすることをお薦めします。
XMLExists式は、XQuery Full Text(XQFT)述語を使用してトランスポータブル・バイナリXMLとして格納されるXMLTypeデータの問合せをサポートします。SQL WHERE句内のXMLExists式でXQFT全文述語を使用する場合は、XML検索索引を作成する必要があります。この項では、このような索引の作成と使用について説明します。
Oracleでは、データをトランスポータブル・バイナリXML形式で格納することをお薦めします。データでTBX記憶域を使用していない場合でも、XQuery Full Text CONTEXT索引またはOracle Text索引を作成してXMLデータを索引付けできます。XQuery Full Text CONTEXT索引の作成方法の詳細は、「全文問合せのXMLデータの索引付け(23ai前)」を参照してください。
- XML検索索引の作成と使用
XML検索索引を作成するには、CREATE SEARCH INDEX
文でFOR XML句を指定します。XML検索索引は、23aiデフォルトであるTRANSPORTABLE BINARY XML (TBX)記憶域オプションを使用してドキュメントを格納するSYS.XMLType
データ型の列にのみ作成できます。 - 「XML検索索引のメンテナンス」
XML検索索引は非同期索引です。新しいドキュメントが同期されるまで、新しいドキュメントは索引によってすぐに反映されません。 - プリファレンスのデフォルトおよび推奨事項
- XML検索索引を使用した問合せ
- XML検索索引を使用するための移行
XML検索索引は、XMLTypeがトランスポータブル・バイナリXMLとして格納されている場合にのみ使用できます。
関連項目:
-
CONTEXT索引およびOracle Text Search索引の詳細は、「Oracle Text Reference」を参照してください。
-
XQuery Full Text索引を使用してXMLデータを索引付けする方法の詳細は、「フルテキスト問合せ用のXMLデータの索引付け(23ai前)」を参照してください。
親トピック: XMLTypeデータの索引
XML検索索引の作成と使用
XML検索索引を作成するには、CREATE SEARCH INDEX
文でFOR XML句を指定します。XML検索索引は、23aiデフォルトであるTRANSPORTABLE BINARY XML (TBX)記憶域オプションを使用してドキュメントを格納するSYS.XMLType
データ型の列にのみ作成できます。
XQuery Full Text問合せでは、パフォーマンスを高めるためにXML検索索引を使用できます。XML検索索引を作成するには、データベース・ロールCTXAPP
を付与されている必要があります。一般的にこのロールは、Oracle Text索引の作成とメンテナンス、Oracle Text索引プリファレンスの設定、またはOracle Text PL/SQLパッケージの使用に必要です。
XML検索索引を作成するには、CREATE SEARCH INDEX
文でFOR XML句を指定します。XML検索索引は、TRANSPORTABLE BINARY XML
(TBX)記憶域オプションを使用してドキュメントを格納するSYS.XMLType
データ型の列にのみ作成できます。
SYS.XMLTYPE
型の列に対してFOR XML句なしでCREATE SEARCH INDEX
コマンドを実行すると、作成された索引のタイプは、列の記憶域オプションによって異なります。列の記憶域オプションがTBXの場合、XML検索索引が作成されます。それ以外の場合は、Oracle Text索引が作成されます。
CREATE SEARCH INDEX xml_ft_idx ON xmldoctab (document);
列の記憶域オプションがTBXであることを確認した場合は、FOR XML句を明示的に使用できます。
CREATE SEARCH INDEX xml_ft_idx ON xmldoctab (tbx_document) FOR XML;
XML検索索引を作成する場合は、索引を利用する問合せのタイプを決定する必要があります。
問合せのタイプ | SEARCH_ON引数 |
---|---|
XQuery Full Text |
|
数値による範囲検索 |
|
タイムスタンプでの範囲検索 |
|
キーワードの範囲検索 |
|
XMLExists
演算子でXQuery Full Text述語のみを使用する場合は、索引のパラメータ文字列にSEARCH_ON TEXT
を指定します。これは、SEARCH_ON
句が指定されていない場合のデフォルトです。
CREATE SEARCH INDEX xml_ft_idx ON xmldoctab (tbx_document) FOR XML PARAMETERS ('SEARCH_ON TEXT');
PARAMETERS
句の一部として、複数のSEARCH_ON
句を指定できます。
CREATE SEARCH INDEX xml_ft_idx ON xmldoctab (tbx_document) FOR XML PARAMETERS ('SEARCH_ON VALUE(BINARY_DOUBLE) SEARCH_ON VALUE(VARCHAR2)');
同様に、次のように1つの句に結合できます。
CREATE SEARCH INDEX xml_ft_idx ON xmldoctab (tbx_document) FOR XML PARAMETERS ('SEARCH_ON VALUE(BINARY_DOUBLE, VARCHAR2)');
ノート:
同じデータ型を複数回指定することはできません。
範囲検索問合せと全文検索問合せの両方で索引を有効にする場合は、SEARCH_ON TEXT_VALUE
を指定します。
CREATE SEARCH INDEX xml_ft_idx ON xmldoctab (tbx_document) FOR XML PARAMETERS ('SEARCH_ON TEXT_VALUE(BINARY_DOUBLE, VARCHAR2, TIMESTAMP)');
TBXオプションを使用して格納されていないXMLデータには、XQuery Full Text CONTEXT
索引を作成することで索引付けできます。
XML検索索引の構文:
CREATE SEARCH INDEX [schema.]index ON [schema.]table(xml_column) FOR XML [LOCAL] PARAMETERS( [SEARCH_ON (TEXT | TEXT_VALUE(data_types) | VALUE(data_types))] [STORAGE storage_pref] [MEMORY memsize] [SYNC (MANUAL | EVERY "interval-string" | ON COMMIT)] [MAINTENANCE AUTO | MAINTENANCE MANUAL] [OPTIMIZE (MANUAL | EVERY "interval-string" | AUTO_DAILY)] ) [PARALLEL N] [UNUSABLE];
説明:
-
[schema.]index
は、作成するXML検索索引の名前を指定します。 -
[schema.]table(xml_column)
は、索引付けする表および列の名前を指定します。xml_column
は、索引が作成される列の名前です。
関連項目:
これらのパラメータの詳細は、『Oracle Textリファレンス』を参照してください。
XML検索索引のメンテナンス
XML検索索引は非同期索引です。新しいドキュメントが同期されるまで、新しいドキュメントは索引によってすぐに反映されません。
XML検索索引を保持する場合、索引はデフォルトでシステム制御方式でバックグラウンドで索引付けされていない文書を同期化します。索引の同期化は、プロシージャCTX_DDL.SYNC_INDEX
を起動してオンデマンドでトリガーすることもできます。
索引の同期化は、トランザクションのコミット時または少なくとも時間間隔の経過後に定期的に行われるようにチューニングできます。索引の同期化の方法を変更するには、次のようにSYNC
オプションを指定します:
-
SYNC (ON COMMIT)
– 索引はトランザクションのコミット中に同期化されます。 -
SYNC (EVERY "interval information")
– 索引付けが保留中のドキュメントがあるかどうかを確認することで、索引はバックグラウンドで定期的に同期化されます。
コミット時に同期するXML検索索引を作成するには:
CREATE SEARCH INDEX xml_ft_idx ON xmldoctab (tbx_document) FOR XML PARAMETERS ('SYNC (ON COMMIT) SEARCH_ON TEXT_VALUE(BINARY_DOUBLE, VARCHAR2)');
2時間ごとに同期するXML検索索引を作成するには、次の手順に従います。
CREATE SEARCH INDEX xml_ft_idx ON xmldoctab (tbx_document) FOR XML PARAMETERS ('SYNC (EVERY "FREQ=HOURLY;INTERVAL=2") SEARCH_ON TEXT_VALUE(BINARY_DOUBLE, VARCHAR2)');
関連項目:
索引の同期化とメンテナンスの詳細は、『Oracle Textリファレンス』を参照してください
プリファレンスのデフォルトおよび推奨事項
Oracle TextプリファレンスなしでXML検索索引を作成すると、次のプリファレンスがデフォルトで有効になります。
プリファレンス | 属性 | 値 |
---|---|---|
該当なし |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
XML検索索引の作成時に、独自のテキスト索引プリファレンスを指定できます。Oracleでは、次のプリファレンスを使用することをお薦めします。
-
D_TABLE_CLAUSE
– XML文書の構造に関する情報が含まれている索引データ表$Dの列DOCに対して、SECUREFILE
記憶域を指定します。キャッシュおよび圧縮レベル(MEDIUM)を指定します。 -
I_TABLE_CLAUSE
– 全文トークンと索引付けされた文書でのその出現に関する情報が含まれている索引データ表$Iの列TOKEN_INFO
に対して、SECUREFILE
記憶域を指定します。キャッシュを指定します(ただし圧縮は不要)。 -
STAGE_ITAB
- ステージング表機能を有効にするには、TRUE
を指定します。ステージング表は、特定の行のしきい値に達した後にのみステージング表の内容を索引とマージすることで、メンテナンス操作後の索引の断片化の量を減らします。ステージング表のデータは依然として索引の一部です。 -
STAGE_ITAB_MAX_ROWS
-10000
以上の値を指定します。この値は、DMLによって索引が保持される頻度に応じてチューニングする必要があります。値を大きくすると、ステージング表の内容がマージされる頻度は低くなりますが、ステージング表は断片化されます。 -
STAGE_ITAB_AUTO_OPT
- ステージング表のマージをバックグラウンドで実行できるようにするには、TRUE
を指定します。 -
STAGE_ITAB_PARALLEL
- ステージング表をマージするときに並列度を指定します。デフォルトでは、マージ操作では並列度4が使用されます。
CTX_DDL
パッケージおよびPARAMETERS
句で定義されたインタフェースを使用して、次のオプションのデフォルト以外の値を指定できます。
BEGIN CTX_DDL.create_preference('xml_sto', 'BASIC_STORAGE'); CTX_DDL.set_attribute('xml_sto', 'D_TABLE_CLAUSE', 'TABLESPACE my_ts LOB(DOC) STORE AS SECUREFILE (TABLESPACE my_ts COMPRESS MEDIUM CACHE)'); CTX_DDL.set_attribute('xml_sto', 'I_TABLE_CLAUSE', 'TABLESPACE my_ts LOB(TOKEN_INFO) STORE AS SECUREFILE (TABLESPACE my_ts NOCOMPRESS CACHE)'); CTX_DDL.set_attribute('xml_sto', 'STAGE_ITAB', 'TRUE'); CTX_DDL.set_attribute('xml_sto', 'STAGE_ITAB_MAX_ROWS', '10000'); CTX_DDL.set_attribute('xml_sto', 'STAGE_ITAB_AUTO_OPT', 'TRUE'); CTX_DDL.set_attribute('xml_sto', 'STAGE_ITAB_PARALLEL', '4'); END; / CREATE SEARCH INDEX xml_ft_idx ON xmldoctab (tbx_document) FOR XML PARAMETERS ('STORAGE xml_sto SEARCH_ON TEXT_VALUE(NUMBER, VARCHAR2)');
ノート:
-
プロシージャ
CTX_DDL.set_sec_grp_attr
の詳細は、Oracle Textリファレンスを参照してください。 -
プロシージャ
CTX_DDL.create_preference
の詳細は、Oracle Textリファレンスを参照してください。 -
プロシージャ
CTX_DDL.set_attribute
の詳細は、Oracle Textリファレンスを参照してください。 -
プレファレンス
BASIC_STORAGE
、D_TABLE_CLAUSE
およびI_TABLE_CLAUSE
の詳細は、Oracle Textリファレンスを参照してください。
XML検索索引を使用した問合せ
XML検索索引は、次の演算子を使用して問合せにXMLExists述語がある場合に使用するとみなされます。
-
XQuery Full Text演算子
-
CONTAINS TEXT
-
CONTAINS TEXT … FTAND
-
CONTAINS TEXT … FTOR
-
CONTAINS TEXT … FTAND FTNOT
-
CONTAINS TEXT … WINDOW n WORDS
-
-
範囲検索は、関係演算子を使用して、数値、データ時間または文字列データ型のスカラー値を上回ります。
ノート:
XMLExists
演算子内で索引を取得する述語は、SEARCH_ON
に対する索引の設定によって決まります。全文が使用可能になっていない索引にXQuery Full Text述語演算子を使用すると、コンパイル時にORA-18177エラーが発生します。
XML検索索引を取得する問合せを記述する場合は、次の制限を考慮する必要があります。
-
検索コンテキストのXMLノードを計算する式は、ステップがforward軸およびdescendent軸のみに沿ったXPath式にする必要があります。
-
SQL/XML関数XMLExistsのPASSING句にSQL式として渡すことのできるXMLTypeインスタンスは1つのみで、同じ句内に含まれるその他の非XMLType SQL式はすべて、組込みSQLデータ型のコンパイル時定数、またはこのようなデータ型のインスタンスにバインドされているバインド変数のいずれかである必要があります。
例6-20 XQuery Full Text問合せ
CREATE TABLE PO_BINXML(doc xmltype) xmltype doc STORE AS transportable binary xml; CREATE SEARCH INDEX PO_CTX_IDX ON PO_BINXML(doc) FOR XML PARAMETERS ('search_on text sync (on commit)'); SELECT XMLQuery('for $i in /PurchaseOrder/LineItems/LineItem/Description where $i[. contains text "Big" ftand "Street"] return <Title>{$i}</Title>' PASSING OBJECT_VALUE RETURNING CONTENT) FROM po_binxml WHERE XMLExists('/PurchaseOrder/LineItems/LineItem/Description [. contains text "Big" ftand "Street"]' PASSING OBJECT_VALUE);
例6-21 XQuery Full Text問合せの実行計画
------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 2014 | 4 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| PO_BINXML | 1 | 2014 | 4 (0)| 00:00:01 | |* 2 | DOMAIN INDEX | PO_CTX_IDX | | | 4 (0)| 00:00:01 | ------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("CTXSYS"."CONTAINS"(SYS_MAKEXML(0,"XMLDATA"),'<query><textquery grammar="CONTEXT" lang="english"> ( ( {Big} ) and ( {Street} ) ) INPATH (/PurchaseOrder/LineItems/LineItem/Description)</textquery></query>')>0)
その他の全文問合せの例を次に示します。
説明に「Julius」というテキストが含まれているレコードを取得しています
select id FROM po_binxml where xmlexists('/PurchaseOrder/LineItems/LineItem/Description[. contains text "Julius"]' PASSING doc);
アドレスに「Oracle」または「Austin」というテキストが含まれているレコードを取得しています
select id FROM po_binxml where xmlexists('/PurchaseOrder/ShippingInstructions/address[. contains text "Oracle" ftor "Austin"]' PASSING doc);
XML検索索引を使用する問合せの制限に加えて、問合せで範囲検索述語を使用する場合、次の制限が適用されます。
-
比較値は、コンパイル時定数またはカーソルの実行前にバインドされたバインド変数である必要があります。
-
コンパイル時定数またはバインド変数のデータ型は、索引で有効にする必要があります。
-
リレーショナル述語を
!=
にすることはできません。 -
NOT()
を使用して述語を否定することはできません。
索引に対して正しいデータ型が選択されるように、xs:double
、xs:decimal
、xs:dateTime
などのデータ型コンストラクタを使用して、正しいデータ型が推測されるようにすることができます。
例6-22 XML検索索引によって回答されたXMLExists述語の範囲検索問合せ
CREATE SEARCH INDEX XSIDX ON xtab(doc) FOR xml parameters ('search_on value(number, varchar2, timestamp) sync (on commit)'); SELECT XMLQuery('for $i in /PurchaseOrder return <Details>{$i/User}{$i/Reference}</Details>' PASSING doc RETURNING CONTENT) FROM xtab WHERE XMLExists('/PurchaseOrder/LineItems/LineItem/Part[UnitPrice < 15.0]' PASSING doc);
この問合せは、$15.00より安い1つ以上の品目を含む購買オーダーのユーザーおよび参照を返します。
例6-23 XML検索索引によって回答されたXMLExists述語の範囲検索問合せの実行計画
---------------------------------------------- | Id | Operation | Name | ---------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | SORT AGGREGATE | | |* 2 | FILTER | | | 3 | FAST DUAL | | | 4 | NESTED LOOPS | | | 5 | TABLE ACCESS BY INDEX ROWID| XTAB | |* 6 | DOMAIN INDEX | XSIDX | | 7 | XPATH EVALUATION | | ---------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter(:B1 IS NOT NULL) 6 - access("CTXSYS"."CONTAINS"(SYS_MAKEXML(131072,"SYS_NC00002$"),'<query>< textquery grammar="CONTEXT" lang="english">sdata(FNUM_284549FF0C91A6F6A8AABBEE 2B5798E5_UnitPrice < 15.0 )</textquery></query>')>0)
2月5日以降のオーダーの取得
SELECT id from xtab where xmlexists('/PurchaseOrder[@orderDate > xs:dateTime("2024-02-05")]' PASSING doc);
「摘要」 > 「Light」でのオーダーの取得
SELECT id from xtab where xmlexists('/PurchaseOrder/LineItems/LineItem[Description > "Lava"]' PASSING doc);
問合せで使用される索引
XMLType列の唯一の索引がXML検索索引である場合、問合せはデフォルトでXML検索索引の使用を試みます。
ただし、XML検索索引と同じ列に構造化XMLIndexがある場合、構造化XMLIndexの使用はXML検索索引よりも優先されます。
XQuery Full Text問合せでは、引き続きXML検索索引が選択されますが、範囲検索問合せでは、かわりに構造化XMLIndexが使用されます。
この動作は、ora:use_xmltext_idx
プラグマを使用してXML検索索引が構造化XML索引よりも優先的に取得されるように強制することでオーバーライドできます。
SELECT XMLQuery('for $i in /PurchaseOrder return <Details>{$i/User}{$i/Reference}</Details>' PASSING doc RETURNING CONTENT) FROM xtab WHERE XMLExists('(#ora:use_xmltext_idx #)){/PurchaseOrder/LineItems/LineItem/Part[UnitPrice < 15.0]}' PASSING doc);
さらに、NO_INDEX
ヒントを使用すると、XML検索索引がまったく考慮されないようにできます。
XML検索索引を使用するための移行
XML検索索引は、XMLTypeがトランスポータブル・バイナリXMLとして格納されている場合にのみ使用できます。
SQL関数CONTAINS
を使用する非トランスポータブル・バイナリXMLとして格納されたXMLTypeデータに対するレガシー問合せと、XML対応ではないOracle Text索引がある場合、トランスポータブル・バイナリXML記憶域を使用してXML検索索引を使用するようにデータを移行できます。
さらに、XQuery Full Textコンテキスト索引とともに非トランスポータブル・バイナリXMLとして格納されたXMLTypeデータに対するレガシー問合せがある場合は、トランスポータブル・バイナリXMLを使用してXML検索索引を使用するようにこのデータを移行することもできます。
Oracleでは、XML文書の非構造化セクションの索引付けにXML検索索引を使用することをお薦めします。XML検索索引を使用すると、データ・パーティション化の柔軟性が大幅に向上します。CONTEXT索引およびXQuery Full Text索引は、レンジ・パーティション化表でのみローカルにパーティション化できます。
CONTEXT索引からXML検索索引に移行する場合、CONTAINS
関数の使用はXMLEXISTS
述語に置き換える必要があります。
XQFT索引からXML検索索引に移行する場合、XMLExists述語の一部内で使用されるora:use_xmltext_idx
プラグマは、同じ列に構造化XML索引がある場合にXML検索索引を強制的に選択するためにのみ必要です。
Oracle Text索引の使用からXML検索索引への移行
次の表に、XML検索索引を使用する場合のOracle Text固有の演算子を使用した一般的な問合せとその置換の例を示します。
元の例 | 置換後の例 |
---|---|
CONTAINS(t.x, 'HASPATH (/P/LIs/LI/Description)') > 0 |
XMLExists('$d/P/LIs/LI/Description}' PASSING t.x AS "d") |
CONTAINS(t.x, 'Big INPATH (/P/LIs/LI/Description)') > 0 |
XMLExists('$d/P/LIs/LI/Description [. contains text "Big"]' PASSING t.x AS "d") |
CONTAINS(t.x, '(Big) AND (Street) INPATH (/P/LIs/LI/Description)') > 0 |
XMLExists('$d/P/LIs/LI/Description [. contains text "Big" ftand "Street"]' PASSING t.x AS "d") |
CONTAINS(t.x, '(Big) OR (Street) INPATH (/P/LIs/LI/Description)') > 0 |
XMLExists('$d/P/LIs/LI/Description [. contains text "Big" ftor "Street"]' PASSING t.x AS "d") |
CONTAINS(t.x, '({Big}) NOT ({Street}) INPATH (/P/LIs/LI/Description)') > 0 |
XMLExists('$d/P/LIs/LI/Description [. contains text "Big" ftand ftnot "Street"]' PASSING t.x AS "d") |
CONTAINS(t.x, '({Street}) MNOT ({Big Street}) INPATH (/P/LIs/LI/Description)') > 0 |
XMLExists('$d/P/LIs/LI/Description [. contains text "Street" not in "Big Street"]' PASSING t.x AS "d") |
CONTAINS(t.x, '(NEAR (({Big}, {Street}), 3) INPATH (/P/LIs/LI/Description)') > 0 |
XMLExists('$d/P/LIs/LI/Description [. contains text "Big" ftand "Street" window 3 words]' PASSING t.x AS "d") |
(適用なし – Oracle Text問合せはXML名前空間に非対応) |
XMLExists('declare namespace ipo="http://www.example.com/IPO"; /ipo:P/ipo:LIs/ipo:LI/ipo:Description [. contains text "Big"]' PASSING t.x AS "d") |
パスのテストには述語式を含めることができ、それは元の問合せ(HASPATHを使用)でも置換後の問合せでも同じです。たとえば:
/PurchaseOrder/LineItems/LineItem/Part[@Id < "31415927"]
XQuery Full Text索引の使用からXML検索索引への移行
XQuery Full Text索引の主な目的は、XQuery Full Text述語を使用してXML文書内のデータを効率的に検索することです。
XQuery Full Text索引を作成するには、基礎となるCONTEXT索引を構成するためのセクション・グループおよび記憶域プリファレンスを作成する必要があります。
XML検索索引を使用する場合の同等の索引作成文は次のとおりです。
CREATE SEARCH INDEX xml_ft_idx ON xmldoctab (tbx_document) FOR XML PARAMETESRS ('SEARCH_ON TEXT');
オブジェクト・リレーショナル形式で格納されたXMLTypeデータの索引付け
XMLノードに対応する基礎となるデータベース列に対してBツリー索引を作成することで、オブジェクト・リレーショナル形式で格納されたXMLType
データを効果的に索引付けできます。
索引付けされるデータが単一の場合、つまりXMLインスタンス文書で一度のみ発生する可能性がある場合、表面的上ファンクション索引を作成するショートカットを使用できます。この場合、索引を定義する式はファンクション・アプリケーションで、単一データをターゲットとするXPath式の引数を使用します。ショートカットはXMLQuery
に適用されるXMLCast
に対して定義され、もう1つのショートカットはOracle SQL関数extractValue
に対して定義されます(非推奨)。
多くの場合、Oracle XML DBでは、基礎となるオブジェクト・リレーショナル表または列に対して適切な索引が自動的に作成されますが、CREATE INDEX文が示すように、ターゲットとなるXMLType
データに対して、ファンクション索引は作成されません
。
extractValue
ショートカットの場合、作成される索引はBツリー索引です。XMLQuery
に適用されるXMLCast
の場合、作成される索引は、ファンクション式から得られるスカラー値に対するファンクション索引です。
索引付けされるデータがコレクションの場合、このようなショートカットを使用できません。手動でBツリー索引を作成する必要があります。
- 繰り返し使用しないテキスト・ノードまたは属性値の索引付け
サンプル・データベース・スキーマOE
の表purchaseorder
はオブジェクト・リレーショナルに格納されます。各発注書には単一のReference
要素が含まれます。つまりこの要素は単一です。したがって、ショートカットを使用して、基礎となるオブジェクト・リレーショナル・データに索引を作成できます。 - 繰り返し使用する(コレクション)要素の索引付け
オブジェクト・リレーショナル形式で格納されたXMLType
データでは、コレクションはXMLType
インスタンスのOrdered Collection Table (OCT)として格納されるため、メンバーに直接アクセスできます。オブジェクト・リレーショナル記憶域は、XMLデータのファイングレイン構造を直接反映するため、各コレクション・メンバーをターゲットとする索引を作成できます。
親トピック: XMLTypeデータの索引
繰り返し使用しないテキスト・ノードまたは属性値の索引付け
サンプル・データベース・スキーマOE
の表purchaseorder
はオブジェクト・リレーショナルに格納されます。各発注書には単一のReference
要素が含まれます。つまりこの要素は単一です。したがって、ショートカットを使用して、基礎となるオブジェクト・リレーショナル・データに索引を作成できます。
例6-24に、Reference
要素のテキスト・コンテンツをターゲットとし、XMLQuery
に適用されるXMLCast
を使用して、表面上ファンクション索引を作成しようとするCREATE INDEX
文を示します。(この要素のコンテンツはテキストのみのため、要素をターゲットにすることは、XPathノード・テストtext()
を使用してテキスト・ノードをターゲットにすることと同じです。)
例6-25は、同じデータをターゲットにし、Oracle SQL関数extractValue
(非推奨)を使用して表面上ファンクション索引を作成します。
実際、例6-24と例6-25では、ターゲットとなるXMLType
データに対してファンクション索引は作成されません。かわりに、Oracle XML DBによってCREATE INDEX
文がリライトされ、基礎となるスカラー・データに対して索引が作成されます。
これらのショートカットのいずれかを使用するとき、CREATE INDEX
文は前述のように基礎となるスカラー・データ上に索引を作成できない場合があります。そのかわり、実際には参照されるXMLType
データにファンクション索引を作成します。(これは索引の値がスカラーである場合でも当てはまります)。
このような場合は、索引を削除し、同じXPathをターゲットとする構造化コンポーネントを含むXMLIndex
索引をかわりに作成します。一般的に、XMLType
データに対してはファンクション索引を使用しないことをお薦めします。
これは使用される格納方法にかかわらず、XMLType
データの一般的なルールです。ファンクション索引のかわりに構造化コンポーネントでXMLIndex
を使用します。このルールはOracle Database 11gリリース 2 (11.2)から適用されます。このルールを守ることにより、ファンクション索引のメンテナンス操作に関連するオーバーヘッドを軽減し、オプティマイザで索引を適切に選択できる状況が増えます。
例6-24 単一の要素でXMLCASTおよびXMLQUERYを使用したCREATE INDEX
CREATE INDEX po_reference_ix ON purchaseorder (XMLCast(XMLQuery ('$p/PurchaseOrder/Reference' PASSING po.OBJECT_VALUE AS "p" RETURNING CONTENT) AS VARCHAR2(128)));
例6-25 単一の要素でEXTRACTVALUEを使用したCREATE INDEX
CREATE INDEX po_reference_ix ON purchaseorder (extractValue(OBJECT_VALUE, '/PurchaseOrder/Reference'));
繰り返し使用する(コレクション)要素の索引付け
オブジェクト・リレーショナル形式で格納されたXMLType
データでは、コレクションはXMLType
インスタンスのOrdered Collection Table (OCT)として格納されるため、メンバーに直接アクセスできます。オブジェクト・リレーショナル記憶域は、XMLデータのファイングレイン構造を直接反映するため、各コレクション・メンバーをターゲットとする索引を作成できます。
このような索引は、手動で作成する必要があります。Oracle SQL関数extractValue
(非推奨)に対して表面上ファンクション索引を作成する場合に、Bツリー索引を自動的に作成する専用の機能は、コレクションに適用されません(extractValue
に渡されるXPath式は、単一要素をターゲットにする必要があります)。
コレクションに対してBツリー索引を作成するには、コレクションの管理に使用するSQLオブジェクトの構造を理解する必要があります。その情報に基づき、従来のオブジェクト・リレーショナルSQLコードを使用して、適切なSQLオブジェクト属性に対して索引を直接作成できます。この方法の例は、ガイドライン: Ordered Collection Tableに対する索引の作成を参照してください。