Oracle 10g中的XMLType

时间:2015-04-20 09:10:11

标签: database oracle performance indexing oracle10g

我们必须在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

1 个答案:

答案 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。