10.6. XQuery の最適化
ドキュメント展開と呼ばれる手法は、コンテキスト項目ドキュメントのメモリーフットプリントを削減するために使用されます。ドキュメントの展開は、関連する XQuery およびパス式で必要なドキュメントの一部のみを読み込みます。ドキュメントプロジェクト分析は関連するすべてのパス式を使用するため、/a/ b/x ではなく //x
など、多数のノードを使用できる可能性のある 1 つの式でもメモリーフットプリントが大きくなります。関連するコンテンツが削除された場合でも、処理のためにドキュメント全体がメモリーに読み込まれます。ドキュメントの展開は、XMLTABLE/XMLQUERY に渡されるコンテキストアイテム(名前のない PASSING 句項目)がある場合にのみ使用されます。名前付き変数には、ドキュメントの展開は実行されません。オプティマイザーがドキュメントの展開を使用するために、使用する式が複雑すぎることがあります。適切な最適化が実行されたかどうかを確認するには、SHOWPLAN DEBUG の完全なプランの出力を確認してください。
追加の制限により、Simple コンテキストパス式を使用すると、メモリーの完全なドキュメントをロードせずに、プロセッサーがドキュメントサブツリーを個別に評価できます。単純なコンテキストパス式の形式は [/][ns:]root/[ns1:]elem/…'
の形式にすることができます。ここで、namespace プレフィックスまたは要素名は *ワイルドカードにすることもできます。XQuery 式で名前空間接頭辞が使用されている場合の通常の XQuery 処理と同様に、XMLNAMESPACES 句を使用して宣言する必要があります。
適格な XMLQUERY のストリーミング
XMLQUERY('/*:root/*:child' PASSING doc)
XMLQUERY('/*:root/*:child' PASSING doc)
ドキュメントインメモリー全体を DOM ツリーとしてロードするのではなく、各子要素は結果を別個に追加されます。
受信可能な XMLQUERY のストリーミング
XMLQUERY('//child' PASSING doc)
XMLQUERY('//child' PASSING doc)
子軸を使用するとストリーミングの最適化は回避されますが、ドキュメントの展開は引き続き実行できます。
XMLTABLE を使用する場合は、COLUMN PATH 式に追加の制限があります。これらはコンテキスト式によって形成された要素サブツリーの任意の部分を参照することができ、直接親から任意の属性値を使用できます。現在のコンテキストアイテムの ancestor またはシブリングを参照できるパス式により、ストリーミングが使用できなくなります。
適格な XMLTABLE のストリーミング
XMLTABLE('/*:root/*:child' PASSING doc COLUMNS fullchild XML PATH '.', parent_attr string PATH '../@attr', child_val integer)
XMLTABLE('/*:root/*:child' PASSING doc COLUMNS fullchild XML PATH '.', parent_attr string PATH '../@attr', child_val integer)
コンテキスト XQuery と列パス式では、ドキュメント全体のインメモリーを DOM ツリーとしてロードするのではなく、ストリーミングの最適化が可能になります。各子要素は、結果に個別に追加されます。
streaming ineligible XMLTABLE
XMLTABLE('/*:root/*:child' PASSING doc COLUMNS sibling_attr string PATH '../other_child/@attr')
XMLTABLE('/*:root/*:child' PASSING doc COLUMNS sibling_attr string PATH '../other_child/@attr')
sibling_attr パスの子サブツリー外の要素の参照により、ストリーミングの最適化は使用されませんが、ドキュメントの展開は依然として実行できます。
パフォーマンスの問題を回避するために、列パスはできるだけターゲットである必要があります。..//child
などの一般的なパスにより、各出力行でコンテキストアイテムのサブツリー全体が検索されます。