文書処理には多くの時間とリソースが必要ですが、多くの場合、文書投影とストリーミングモードのおかげで、より迅速かつ効率的に行うことができます。このセクションでは、これら2つのテクニックについて説明します。
Document Projection
ドキュメントプロジェクションとは、 、クエリを分析し、ドキュメントのどの部分が必要かを判断し、その部分のみを使用してそれを表現するツリーを構築する特別なメカニズムです。
その結果、各子要素は独立して追加され、ドキュメント全体をメモリに読み込む必要はありません。そのため、メモリフットプリントが削減されます。
XQuery Streaming
比較的大きな LARGE ドキュメントでもこの方法で処理することができます。
独立したサブツリーはドキュメント全体を読み込むことなく処理され、データは到着順に処理されるため、ストリーミングモードでは一部の操作(ソートなど)を実行できません。そして一般的に、クエリが複雑になればなるほど、ストリーミングモードを使用できる可能性は低くなります。
Syntax
SELECT
XMLQUERY
(
'/*:root/*:child'
PASSING doc
)
Rules
ストリーミング・モードには以下のPre-requisitesがあります:
- 文書投影は、与えられた文書に適用することができます;
XQuery パス式は特定の条件を満たします。
XQueryストリーミングの本質的な原則(および主な制限)は、与えられたノードに対して、その子要素のみを1回、1つずつ読み取ることができるということです。XQuery ストリーミングを使用する際は、以下の点に注意してください:
- パス表現は下向きの選択のみを使用しなければなりません;
- ノードを使用する可能性のある 式が 1 つでもあると(例えば、/a/b/x ではなく //x など)、XQuery ストリーミング最適化が妨げられます;
- 述語は属性を参照できますが、フィルタリングされるノードの子要素は参照できません;
- ストリーム・ノードは変数にバインドすることはできません(これはFLWOR式の多くの用途を除外します);
- ストリーム・ノードは、関数呼び出しの引数として渡してはなりません(組み込み関数呼び出しを除く);
- クエリ内の GLOBAL 変数は、コンテキスト・アイテムを参照してはなりません;
- ストリーミング・モードでのXML処理は、whitespace-onlyのテキスト・ノードを扱う際に、非ストリーミング・モードとは異なる動作をすることがあります。
Eligible and Ineligible Queries
ドキュメント投影は、"[/][ns:]root/[ns1:]elem/..." のようなパス式を持つ最適化された XQuery でのみ使用できます。 通常の XQuery 処理と同様に、名前空間接頭辞が XQuery 式で使用される場合は、XMLNAMESPACES
句を使用して宣言する必要があります。
XML Queries
Eligible XML Query
次のクエリでは、パス内で正確に定義された親要素と子要素を扱うため、ドキュメント・プロジェクションと XQuery ストリーミング最適化を使用できます:
SELECT XMLQUERY
(
'/*:book/*:volume'
PASSING
XMLPARSE
(
document
'<book xmlns:ns1=
"uri"
>
<volume>The Fellowship of the Ring</volume>
<volume>The Two Towers</volume>
<volume>The Return of the King</volume>
</book>'
)
)
Ineligible XML Query
このクエリは上記のクエリと同じ結果を返しますが、この場合、子孫軸//*:volume
が使用されるため、XQuery Optimization は適用できません:
SELECT
XMLQUERY
(
'//*:volume'
PASSING
XMLPARSE
(
document
'<book xmlns:ns1="uri">
<volume>The Fellowship of the Ring</volume>
<volume>The Two Towers</volume>
<volume>The Return of the King</volume>
</book>'
)
)
Eligible XMLTABLE Queries
XMLTABLE
を使用する場合、COLUMN PATH XQUERY EXPRESSION
には追加の制限があります:
- これらは、
CONTEXT XQUERY EXPRESSION
によって形成される要素サブツリーの任意の部分を参照することができます; - 直系親族の属性値を使用することができます;
-
COLUMN PATH XQUERY EXPRESSION
現在のコンテキスト項目の直接でない先祖または兄弟を参照すると、XQuery ストリーミング最適化が使用できなくなります。
Eligible XMLTABLE Query
この場合、コンテキスト XQuery 式と列パス XQuery 式により、XQuery ストリーミング最適化が可能になります:
SELECT
x.fullchild,
x.parent_attr,
x.child_val
FROM
XMLTABLE
(
'/*:book/*:volume'
PASSING
XMLPARSE
(
document
'
<book attr="The Lord of the Rings">
<volume attr="Part 1">The Fellowship of the Ring</volume>
<volume attr="Part 2">The Two Towers</volume>
<volume attr="Part 3">The Return of the King</volume>
<Author attr="Context">J. R. R. Tolkien</Author>
</book>'
)
COLUMNS
fullchild XML PATH
'.'
,
parent_attr string PATH
'../@attr'
,
child_val string PATH
'.'
) x
Ineligible XMLTABLE Query
以下の例では、sibling_attr
パスの子サブツリー外の要素を参照しているため、XQuery ストリーミング最適化が使用できません:
SELECT
x.sibling_attr
FROM
XMLTABLE
(
'/*:book/*:volume'
PASSING
XMLPARSE
(
document
'
<book attr="The Lord of the Rings">
<volume attr="Part 1">The Fellowship of the Ring</volume>
<volume attr="Part 2">The Two Towers</volume>
<volume attr="Part 3">The Return of the King</volume>
<Author attr="Context">J. R. R. Tolkien</Author>
</book>'
)
COLUMNS
sibling_attr string PATH
'../Author/@attr'
) x