首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle10g中的XMLType

Oracle10g中的XMLType
EN

Stack Overflow用户
提问于 2015-04-20 09:10:10
回答 1查看 791关注 0票数 1

我们必须将xml存储在oracle数据库中,因为我使用XMLType作为其中一列的数据类型。今天,表中有40000条记录,我使用"extractValue“函数来获取xml。获取记录查询需要14秒钟。在查询下面查找。

代码语言:javascript
复制
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;

我已经创建了下面的索引,但这也没有帮助。

代码语言:javascript
复制
CREATE INDEX gim_data_ix ON TESTDATA
  (extractValue(gim_data, '/Envelope/Body/ref/instr/instrId));

我试图创建XMLIndex,但Oracle11g支持它。是否有任何方法可以创建索引来提高查询性能或其他方法。

谢谢萨奇

EN

回答 1

Stack Overflow用户

发布于 2015-04-20 12:21:16

您没有提供足够的信息来理解如何提高应用程序的性能,但是可能会有所帮助。

在XMLType表和列上创建基于函数的索引 在例4-26中创建的索引是一个基于函数的索引的示例.基于函数的索引是通过计算表中每一行的指定函数来创建的。在这种情况下,函数的结果不是有用的,因此索引本身是无用的。然而,有许多情况下,基于功能的指标是有用的. 基于函数的索引何时有用的一个例子是当XML内容没有使用结构化存储进行管理时。在这种情况下,不是重写created语句,而是通过调用XML内容上的函数并对结果进行索引来创建索引。 鉴于在示例4-28中创建的表使用CLOB存储而不是结构化存储来持久化XML,下面的created语句将导致在属于引用元素的文本节点的值上创建一个基于函数的索引。如示例所示,此索引将对与引用元素关联的文本节点的值强制执行唯一约束。 示例4-28在基于CLOB的XMLType()上创建基于函数的索引 将XMLTYPE XMLType存储的表XMLType创建为CLOB元素"http://localhost:8080/home/SCOTT/poSource/xsd/purchaseOrder.xsd#PurchaseOrder";表创建“。-插入到PURCHASEORDER_CLOB中,从PURCHASEORDER中选择object_value;创建134个行。在iPURCHASEORDER_REFERENCE上创建惟一索引PURCHASEORDER_CLOB (extractValue(object_value,'/PurchaseOrder/Reference'));创建索引。插入到PURCHASEORDER_CLOB值(ORA类型( bfilename('XMLDIR','EABEL-20021009123335791PDT.xml'),nls_charset_id('AL32UTF8') );插入到PURCHASEORDER_CLOB*错误的第1行: ORA-00001:唯一约束(SCOTT.IPURCHASEORDER_REFERENCE)被违反 在创建和使用基于函数的索引时要记住的一件事是,当WHERE子句中包含的函数与用于创建索引的函数相同时,优化器才会考虑使用索引。 考虑示例4-29中的查询,它们都找到了与引用元素关联的t ext节点的基于PurchaseOrder的值。注意,使用existsNode()定位文档的第一个查询不使用索引,而使用extractValue()的第二个查询使用索引。

也要考虑..。

在集合的内容上创建B树索引 您可能经常需要在目标文档中发生不止一次的节点上创建索引。例如,假设您希望在LineItem元素的Id属性上创建一个索引。逻辑上的第一次尝试是使用示例4-25中所示的语法创建索引。 示例4-25使用extractValue()在重复元素或属性上创建索引 在PURCHASEORDER上创建索引iLINEITEM_UPCCODE ( EXTRACTVALUE (object_value,EXTRACTVALUE(object_value,'/PurchaseOrder/LineItems/LineItem/Part/@Id')) * ERROR ),第3行: ORA-19025: EXTRACTVALUE只返回一个节点的值) 可以看到,当被索引的元素或属性在文档中多次发生时,create失败,因为只允许extractValue()为每一行进程返回一个值。可以创建一个索引,将extractValue()替换为提取().getStringVal(),如例4-26所示。 示例4-26使用提取().getStringVal()在提取()上创建基于函数的索引 在PURCHASEORDER上创建索引iLINEITEM_UPCCODE (提取(object_value,创建的object_value索引)。 这允许Create语句成功。然而,创建的索引并不是预期的那样。索引是通过调用表中每一行的提取()和getStringVal()函数来创建的,然后根据行的rowid对函数的结果进行索引。 这种技术的问题是,当XPath表达式提供给提取()函数时,提取()函数只能返回多个节点。提取()函数的结果是一个包含匹配节点的片段组成的单个XMLType。在包含片段的getStringVal()上调用XMLType的结果是相关节点的连接,如例4-27所示。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29743600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档