文書処理には多くの時間とリソースが必要ですが、多くの場合、文書投影とストリーミングモードのおかげで、より迅速かつ効率的に行うことができます。このセクションでは、これら2つのテクニックについて説明します。

Document Projection

ドキュメントプロジェクションとは、 、クエリを分析し、ドキュメントのどの部分が必要かを判断し、その部分のみを使用してそれを表現するツリーを構築する特別なメカニズムです。

その結果、各子要素は独立して追加され、ドキュメント全体をメモリに読み込む必要はありません。そのため、メモリフットプリントが削減されます。

XQuery Streaming

比較的大きな LARGE ドキュメントでもこの方法で処理することができます。

独立したサブツリーはドキュメント全体を読み込むことなく処理され、データは到着順に処理されるため、ストリーミングモードでは一部の操作(ソートなど)を実行できません。そして一般的に、クエリが複雑になればなるほど、ストリーミングモードを使用できる可能性は低くなります。

Syntax

SELECT
XMLQUERY
(
'/*:root/*:child'
PASSING doc
)

Rules

ストリーミング・モードには以下のPre-requisitesがあります:

  1. 文書投影は、与えられた文書に適用することができます;
  2. 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