繁体   English   中英

Oracle 10g中的XMLType

[英]XMLType in Oracle 10g

我们必须将xml存储在oracle数据库中,因为我将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支持它。 有没有其他方法可以创建索引来提高查询性能。

谢谢萨克

你给了没有足够的信息来了解如何提高应用性能,但这种可能的帮助。

在XMLType表和列上创建基于函数的索引

在示例4–26中创建的索引是基于函数的索引的示例。 通过评估表中每一行的指定功能来创建基于功能的索引。 在那种特殊情况下,函数的结果是没有用的,因此索引本身也没有用。 但是,在许多情况下,基于函数的索引很有用。

基于函数的索引何时有用的一个示例是不使用结构化存储来管理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 

创建和使用基于函数的索引时要记住的一件事是,优化器将仅在WHERE子句中包含的函数与用于创建索引的函数相同时才考虑使用索引。

考虑示例4–29中的查询,这两个查询都找到与Reference元素关联的ext节点的基于PurchaseOrder的值。 请注意,第一个查询(使用existingNode()来定位文档)不使用索引,而第二个查询(使用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()仅被允许为其处理的每一行返回一个值。 如示例4–26所示,可以创建一个将extractValue()替换为extract()。getStringVal()的索引。

示例4-26使用extract()。getStringVal()在extract()上创建基于函数的索引

 CREATE INDEX iLINEITEM_UPCCODE ON PURCHASEORDER ( extract(object_value,'PurchaseOrder/LineItems/LineItem/Part/@Id').getStringVal()); Index created. 

这样可以使Create Index语句成功。 但是,创建的索引不是预期的。 通过为表中的每一行调用extract()和getStringVal()函数,然后针对该行的rowid索引该函数的结果,来创建索引。

这种技术的问题在于,当XPath表达式提供给extract()函数时,extract()函数只能返回多个节点。 extract()函数的结果是一个单个XMLType,由包含匹配节点的片段组成。 在包含片段的XMLType上调用getStringVal()的结果是所讨论的节点的串联,如示例4–27所示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM