以上查询是一个有关如何使用 XQuery 基于 XML 和非 XML 数据(以不同的方式从不同的数据源中检索)生成 XML 文档的示例。具体而言,使用 ora:view() 函数访问 HR 演示模式中的默认 employees 关系表,并使用 PASSING 子句中的 httpuritype() 函数借助于 HTTP 访问 empsbonus.xml 文档。然后,在 FLWOR 表达式的 return 子句中构建新的 XML 文档。最后,将获得以下 XML 文档:
100
Steven King
1200
101
Neena Kochhar
1000
解决性能问题
正如您从前面的部分中了解到的,XQuery 是一种用于查询 Oracle 数据库存储的 XML 内容的高效方法 - 无论您是处理本地存储的 XMLType 数据还是查询基于关系数据构建的 XML 视图。但根据对数据使用的存储类型的不同,XQuery 表达式的执行性能可能迥然不同。尤其是,Oracle XML DB 可以优化基于由 ora:view 函数创建的 SQL/XML 视图而构建的 XQuery 表达式。对于 XMLType 表或列中存储的 XML 数据,只能对使用结构化(对象-关系)存储技术存储的基于 XML 模式的 XMLType 数据进行 XQuery 优化。
所选择的存储模型并非是影响 XQuery 表达式执行性能的唯一因素。在某些情况下,XQuery 表达式本身的结构也可能导致性能问题。要监控 XQuery 表达式的性能,可以打印并检查关联的 EXPLAIN PLAN。在 SQL*Plus 中,只需设置 AUTOTRACE 系统变量,即可打印 SQL 优化程序使用的执行路径。但要执行该操作,请确保创建 PLUSTRACE 角色,然后将其授予连接到数据库所使用的用户。有关如何执行此操作的信息,请参阅 Oracle 数据库 10g 第 2 版 (10.2) 文档中《SQL*Plus 用户指南和参考》一书中的“调整 SQL*Plus”一章。以下示例演示了如何通过检查 EXPLAIN PLAN 生成的执行计划来获得好处。假设您已经将 PLUSTRACE 角色授予默认用户 OE,以 OE/OE 的身份登录并运行以下查询:
这将生成以下输出:
SET AUTOTRACE ON EXPLAIN
SELECT count(*)
FROM oe.purchaseorder, XMLTable(
'for $i in /PurchaseOrder/User
where $i = "CJOHNSON"
return $i'
PASSING OBJECT_VALUE) ptab;
COUNT(*)
----------
9Execution Plan
----------------------------------------------------
Plan hash value: 4046110317----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 226 | 29 (0) | 00:00:01 || 1 | SORT AGGREGATE | | 1 | 226 | | || 2 | NESTED LOOPS | | 10782 | 2379K | 29 (0) | 00:00:01 ||* 3 | TABLE ACCESS FULL | PURCHASEORDER | 1 | 226 | 5 (0) | 00:00:01 || 4 | COLLECTION ITERATOR P| XMLSEQUENCEFROMX| | | | |
Predicate Information (identified by operation id):
---------------------------------------------------3 - filter(SYS_CHECKACL("ACLOID","OWNERID",xmltype('
...