表の列に格納される式には、XMLType
属性で定義されたXPath述語を含めることができます。この項では、第11章で紹介したCar4Sale
の例を使用してXPath述語の適用方法について説明します。そのために、販売対象となる各自動車について公開される情報には、Model
、Price
、Mileage
およびYear
属性のみでなくDetails
属性も含まれています。Details
属性には、次の例に示すように、自動車に関する追加情報がXML形式で含まれています。
<details> <color>White</color> <accessory> <stereo make="Koss">CD</stereo> <GPS> <resolution>1FT</resolution> <memory>64MB</memory> </GPS> </accessory> </details>
Details
属性のサンプル述語はextract(Details, '//stereo[@make="Koss"]') IS NOT NULL
です。この述語を、他のXML属性または非XML属性の1つ以上の述語と結合できます。
オラクル社が提供するXMLType
データ型を使用すると、問合せの標準SQLWHERE
句の中でXML文書にXPath述語を適用できます。これらの述語では、XMLType
データ型のインスタンスにEXTRACT
やEXISTSNODE
などのSQL演算子を使用して、XMLインスタンスのXPath式を処理します。詳細は、『Oracle Database SQL言語リファレンス』および『Oracle XML DB開発者ガイド』を参照してください。
式セットでXPath述語を許可するには、次の例に示すように、sys.XMLType
データ型の属性を使用して対応する属性セットを作成する必要があります。
CREATE OR REPLACE TYPE Car4Sale AS OBJECT (Model VARCHAR2(20), Year NUMBER, Price NUMBER, Mileage NUMBER, Details sys.XMLType);/ BEGIN DBMS_EXPFIL.CREATE_ATTRIBUTE_SET(attr_set => 'Car4Sale', from_type => 'YES'); END; /
次の例に示すように、この属性セットを使用する式セットにはXMLType
属性の述語を含めることができます。
Model='Taurus' and Price < 15000 and Mileage < 25000 AND extract(Details, '//stereo[@make="Koss"]') IS NOT NULL -- or -- Model='Taurus' and Price < 15000 and Mileage < 25000 AND existsNode(Details, '//stereo[@make="Koss"]') = 1
これにより、他の属性値とともにDetails
属性に関するXMLType
のインスタンスをEVALUATE
演算子に渡し、データ項目に対してConsumer
表のInterest
列に格納されている式のセットを処理できます。
SELECT * FROM Consumer WHERE EVALUATE (Consumer.Interest, 'Model=>''Mustang'', Year=>2000, Price=>18000, Mileage=>22000, Details=>sys.XMLType(''<details> <color>White</color> <accessory> <stereo make="Koss">CD</stereo> <GPS> <resolution>1FT</resolution> <memory>64MB</memory> </GPS> </accessory> </details>'')' ) = 1;
前述の問合せでは、XPath述語と非XPath述語に基づいてTRUEとなる式を持つ行がすべて識別されます。
式セットに含まれる大きいXPath述語セットを効率的に処理するために、式セットに定義される式フィルタ索引を(なんらかの単純述語に加えて)XPath述語用に構成できます。式フィルタ索引では、XPath式に含まれる共通性がデータ項目と効率的に比較されます。これらの共通性は、XPath式に示されているXML要素と属性の位置と値に基づきます。
XPath式の中で索引付け可能な構成メンバーは、XML要素のレベル(位置)、XML要素内のテキスト・ノードの値、XML属性の位置および値です。このため、XPath述語はXML文書に示されているXML要素およびXML属性の位置フィルタと値フィルタの組合せとして扱われます。たとえば、次のXPath式は、XML文書では一連のチェックに分解できます。これらのチェックについては、例に続くリストを参照してください。
extract(Details, '//stereo[@make="Koss" and /*/*/GPS/memory[text()="64MB"]]') IS NOT NULL
stereo
要素のレベル(位置)が1以上であること。
レベル1以上に示されるstereo
要素がmake
属性を持つこと。
stereo
要素のmake
属性の値がKoss
であること。
GPS
要素がレベル3に示されること。
memory
要素がレベル4に示されること。
memory
要素に値が64MB
のテキスト・ノードがあること。
式フィルタ索引では、XPath述語の一部の構成メンバーがサポートされません。そのため、XPath述語は常にまばらな述語に含まれ、式のフィルタ処理の最終フェーズで評価されます。まばらな述語の詳細は、第12.4項を参照してください。
式フィルタ索引の位置フィルタは、任意のXML要素またはXML属性から構成できます。値フィルタを構成するには、XML属性の等価性述語とXML要素のテキスト・ノードを使用する必要があります。式セット内で索引付けされるXPath述語ではEXTRACT
またはEXISTSNODE
演算子を使用し、戻り値の検査にパスする必要があります。たとえば、extract(Details, '//stereo[@make="Koss"]') IS NOT NULL
には索引付けできますが、同じ述語に戻り値のIS NULL
チェックが含まれている場合は索引付けできません。
式フィルタでは、次のようなXPath構成メンバーには索引付けできません。
ノード検査の非等価性述語または範囲述語。たとえば、次のXPath述語では、stereo
要素のmake
属性に対する述語には索引付けできません。
extract(Details, '//stereo[@make!="Koss"]') IS NOT NULL
ノード検査内の選言。たとえば、次のXPath述語では、stereo
要素のmake
属性に対する述語には索引付けできません。
extract(Details, '//stereo[@make="Koss" or @make="Bose"]') IS NOT NULL
text()
以外のXML関数を使用するノード検査。たとえば、次のXPath述語では、XML関数position
を使用する述語に索引付けすることはできません。
extract(Details, '//accessory/stereo[position()=3]') IS NOT NULL
ただし、次の例に示すtext()
関数は、stereo
要素の値フィルタとして使用できます。
extract(Details, '//accessory/stereo[text()="CD"]') IS NOT NULL
1つのXPath式でのXML要素または属性への重複する参照。たとえば、XPath式の2つの異なる位置にstereo
要素が示されている場合は、最後の要素のみが索引付けされ、他のすべての参照はまばらな述語の評価中に処理されます。
式フィルタ索引は、最も特異なXML要素および属性を位置および値フィルタとして使用することで、XPath述語を効率的に処理するように構成できます。それぞれが式セットの1つの述語グループとなります。
XPath述語に索引を付けるために、第2.3項で説明した述語表の構造がXMLタグごとに2列を含むように拡張されます。位置フィルタとして構成されたXMLタグの場合、これらの列では各種XPath述語内のタグの相対位置と絶対位置が取得されます。値フィルタとして構成されたXMLタグの場合は、ノード検査でタグに示されている定数とそれに対応する演算子が取得されます。
注意: このリリースでは、等価演算子のみが索引付けされます。 |
図13-1に、次のXMLタグで構成された索引用の述語表の構造を示します。
値フィルタとしてXML属性stereo@make
(述語グループ4: G4)
位置フィルタとしてXML要素stereo
(述語グループ5: G5)
値フィルタとしてXML要素memory
のテキスト・ノード(述語グループ6: G6)
このイメージは、図12-1に示した述語表の拡張として表示できます。この述語表に示されている部分的な行では、次のXPath述語が取得されます。
extract(Details, '//stereo[@make="Koss" and /*/*/GPS/memory[text()="64MB"]]') IS NOT NULL
述語表で取得されたXPath述語は、EVALUATE
演算子に渡されたデータ項目に含まれているXML文書と比較されます。XML文書について索引に使用されたXMLタグの位置と値が計算され、述語表の対応する列に格納されている値と比較されます。stereo@make
属性の値フィルタに関する関係演算子と右辺の定数が述語表のG4_OP
列とG4_RHS
列に格納されている場合(図13-1を参照)、この述語表に対する次の問合せでは、XML文書についてこのチェックを満たす行が識別されます。
SELECT Rid FROM predicate_table WHERE G4_OP = '=' AND G4_RHS in (SELECT column_value FROM TABLE (:G4ValuesArray));
この問合せでは、指定したXML文書に出現するstereo@make
属性すべての値がVARRAYとして表され、:G4ValuesArray
変数にバインドされます。
同様に、stereo
要素の位置制約と絶対レベル(位置)が述語表のG5_OP
列とG5_POS
列に格納されている場合、次の問合せでは、XML文書についてこれらの位置チェックを満たす行がすべて識別されます。
SELECT Rid FROM predicate_table WHERE (G5_OP = '=' AND --- absolute position check -- G5_POS in (SELECT column_value FROM table (:G5PosArray))) OR (G5_OP = '>=' AND --- relative position check -- G5_POS <= SELECT max(column_value) FROM table (:G5PosArray)));
この問合せでは、:G5PosArray
には、XML文書に出現する全stereo
要素のレベルが含まれています。各述語グループに対するこれらのチェックを他の(XPathおよび非XPath)述語グループと組み合せて、完全な述語表の問合せを作成できます。XMLタグのサブセットを最も選択性の高い述語グループとして識別し、索引付き述語グループとして構成できます(第12.4項を参照)。選択的な述語グループのビットマップ索引が作成され、これらの索引が他の索引付き述語グループに対して定義された索引と併用されて、述語表の問合せが効率的に処理されます。
XPath述語セット内で最も特異なXMLタグは、位置フィルタおよび値フィルタとして分類されます。値フィルタが特異とみなされるのは、XMLタグを使用するノード検査が十分に選択的であり、XML文書のサブセットのみが一致する場合です。同様に、位置フィルタが特異とみなされるのは、タグが様々なレベルに示されるか、またはすべてのXML文書に示されないため、そのサブセットのみが一致する場合です。
XPathの位置フィルタと値フィルタは、索引付き述語グループまたはストアド述語グループにさらにマップできます。これらのパラメータを使用して式フィルタ索引を構成するためのPL/SQLプロシージャが用意されています。2つ以上のXMLType
属性からなる属性セットの場合は、各XMLType属性にXMLタグを関連付けることができます。
式セットのXPath索引パラメータは索引パラメータの一部とみなされ、属性セットまたは式セット(式を格納する列)に割り当てることができます。属性セットに割り当てられた索引パラメータはデフォルトとして機能し、その属性セットに関連付けられている式セットすべてで共有されます。
次の例に示すように、DBMS_EXPFIL.DEFAULT_XPINDEX_PARAMETERS
プロシージャを使用すると、属性セットのXMLType
属性に少数のXPath索引パラメータを割り当てることができます。
BEGIN DBMS_EXPFIL.DEFAULT_XPINDEX_PARAMETERS( attr_set => 'Car4Sale', xmlt_attr => 'Details', --- XMLType attribute xptag_list => --- Tag list exf$xpath_tags( exf$xpath_tag(tag_name => 'stereo@make', --- XML attribute tag_indexed => 'TRUE', tag_type => 'VARCHAR(15)'), --- value filter exf$xpath_tag(tag_name => 'stereo', --- XML element tag_indexed => 'FALSE', tag_type => null), --- null => positional filter exf$xpath_tag(tag_name => 'memory', --- XML element tag_indexed => 'TRUE', tag_type => 'VARCHAR(10)') --- value filter ) ); END; /
tag_type
引数の値を指定しないか、またはNULL値を指定すると、XMLタグが位置フィルタとして構成されることに注意してください。
XPath索引パラメータの割当ての詳細は、「DEFAULT_XPINDEX_PARAMETERSプロシージャ」を参照してください。
デフォルトでは、前述のXPath索引パラメータは、Car4Sale
属性セットに関連付けられている式セットに対して作成された索引に使用されます。
CREATE INDEX InterestIndex ON Consumer (Interest) INDEXTYPE IS EXFSYS.EXPFILTER;
単純な索引パラメータとは異なり、XPath索引パラメータの場合、索引の作成時には式セットにあわせて詳細にチューニングできません。ただし、次の例に示すように、DBMS_EXPFIL.INDEX_PARAMETERS
およびDBMS_EXPFIL.XPINDEX_PARAMETERS
プロシージャを使用して、索引パラメータを式セットに直接関連付けてから索引を作成すると、詳細にチューニングできます。
BEGIN -- Derive the index parameters including XPath index params from defaults -- DBMS_EXPFIL.INDEX_PARAMETERS(expr_tab => 'Consumer', expr_col => 'Interest', attr_list => null, operation => 'DEFAULT'); -- fine-tune the XPath index parameters by adding another Tag -- DBMS_EXPFIL.XPINDEX_PARAMETERS(expr_tab => 'Consumer', expr_col => 'Interest', xmlt_attr => 'Details', xptag_list => exf$xpath_tags( exf$xpath_tag(tag_name => 'GPS', tag_indexed => 'TRUE', tag_type => null)), operation => 'ADD'); END; / CREATE INDEX InterestIndex ON Consumer (Interest) INDEXTYPE IS EXFSYS.EXPFILTER;
詳細は、「INDEX_PARAMETERS
プロシージャ」および「XPINDEX_PARAMETERS
プロシージャ」を参照してください。
式を格納する列の索引が作成された後は、EVALUATE
演算子を使用した問合せで、データ項目に関するXPath述語と非XPath述語の大きいセットを効率的に処理できます。
SELECT * FROM Consumer WHERE EVALUATE (Consumer.Interest, 'Model=>''Mustang'', Year=>2000, Price=>18000, Mileage=>22000, Details=>sys.XMLType(''<details> <color>White</color> <accessory> <stereo make="Koss">CD</stereo> <GPS> <resolution>1FT</resolution> <memory>64MB</memory> </GPS> </accessory> </details>'')' ) = 1;
注意: 現行のリリースでは、XPath統計に基づく式フィルタ索引のチューニングはサポートされません。 |