我们必须在oracle数据库中存储xml,因为我使用XMLType作为其中一个列的数据类型。表中有40000条记录,我使用“extractValue”函数来获取xml记录。获取记录查询需要14秒。在下面查询。
SELECT
extractValue(
req.gim_data,
'/Envelope/Body/ref/instr/name') NAME
FROM
TESTDATA req
WHERE
req.gim_data.existsNode('/Envelope/Body/ref/instr[instrId="AAA44444"]') = 1;
我创建了以下索引,但这也无济于事。
CREATE INDEX gim_data_ix ON TESTDATA
(extractValue(gim_data, '/Envelope/Body/ref/instr/instrId));
我尝试创建XMLIndex,但Oracle 11g支持它。有没有办法创建可以提高查询性能的索引或任何其他方式。
由于 sach
答案 0 :(得分:2)
您没有提供足够的信息来了解如何提高应用效果,但this可能有所帮助。
在XMLType表和列上创建基于函数的索引
示例4-26中创建的索引是a的示例 基于功能的索引。通过评估创建基于函数的索引 表中每行的指定函数。在那个特定的 例如,这些功能的结果并没有用 索引本身没用。但是,有很多案例 基于函数的索引很有用。
基于函数的索引有用的一个例子是XML 内容不使用结构化存储进行管理。在这种情况下, 而不是重写的CREATE INDEX语句,索引将 通过调用XML内容和索引上的函数来创建 结果。
给定示例4-28中创建的表,该表使用CLOB存储 而不是结构化存储来持久化XML,如下所示 CREATE INDEX语句将导致基于函数的索引 在属于Reference的文本节点的值上创建 元件。如示例所示,此索引将强制执行唯一 约束与Reference关联的文本节点的值 元件。
示例4-28在基于CLOB的XMLType()
上创建基于函数的索引create table PURCHASEORDER_CLOB of XMLTYPE XMLType store as CLOB ELEMENT "http://localhost:8080/home/SCOTT/poSource/xsd/purchaseOrder.xsd#PurchaseOrder"; Table created. -- insert into PURCHASEORDER_CLOB select object_value from PURCHASEORDER; 134 rows created. create unique index iPURCHASEORDER_REFERENCE on PURCHASEORDER_CLOB (extractValue(object_value,'/PurchaseOrder/Reference')); Index created. insert into PURCHASEORDER_CLOB VALUES ( xmltype ( bfilename('XMLDIR','EABEL-20021009123335791PDT.xml'), nls_charset_id('AL32UTF8') ) ); insert into PURCHASEORDER_CLOB* ERROR at line 1: ORA-00001: unique constraint (SCOTT.IPURCHASEORDER_REFERENCE) violated
在创建和使用基于函数的时候要记住一件事 index是优化器只考虑使用索引的时候 WHERE子句中包含的函数与函数相同 用于创建索引。
考虑例4-29中的查询,它们都找到了 基于PurchaseOrder的t ext节点的值与之关联 参考元素。注意第一个查询,它使用existsNode() 找到文件,不使用索引,而第二个 query,使用extractValue(),确实使用索引。
还要考虑......
创建集合内容的B树索引
您可能经常需要在发生更多事件的节点上创建索引 在目标文件中不止一次。例如,假设你想要 在LineItem元素的Id属性上创建索引。合乎逻辑的 第一次尝试是使用中显示的语法创建索引 例4-25。
示例4-25使用extractValue()在重复上创建索引 元素或属性
CREATE INDEX iLINEITEM_UPCCODE ON PURCHASEORDER (extractValue(object_value,'/PurchaseOrder/LineItems/LineItemPart/@Id')); (extractValue(object_value,'/PurchaseOrder/LineItems/LineItem/Part/@Id')) * ERROR at line 3: ORA-19025: EXTRACTVALUE returns value of only one node
可以看出,当索引的元素或属性出现时 在文档中多次,创建索引失败,因为 extractValue()只允许为每行i返回一个值 过程。可以创建索引替换 extractValue()with extract()。getStringVal(),如例所示 4-26。
示例4-26使用extract()。getStringVal()创建基于函数的 提取物索引()
CREATE INDEX iLINEITEM_UPCCODE ON PURCHASEORDER ( extract(object_value,'PurchaseOrder/LineItems/LineItem/Part/@Id').getStringVal()); Index created.
这允许Create Index语句成功。但是,指数 创建的不是预期的。索引是由。创建的 为每行调用extract()和getStringVal()函数 该表然后索引函数的结果对 划船的行。
这种技术的问题在于,当XPath表达式时 提供给extract()函数,extract()函数只能 返回多个节点。 extract()函数的结果是a 单个XMLType,由包含匹配节点的片段组成。 在包含a的XMLType上调用getStringVal()的结果 fragment是所讨论节点的串联,如图所示 例4-27。