Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database oracle10g中的XMLType_Database_Oracle_Performance_Indexing_Oracle10g - Fatal编程技术网

Database oracle10g中的XMLType

Database oracle10g中的XMLType,database,oracle,performance,indexing,oracle10g,Database,Oracle,Performance,Indexing,Oracle10g,我们必须将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.

我们必须将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支持它。是否有任何方法可以创建索引以提高查询性能或其他任何方法

谢谢
sach

您提供的信息不足以理解如何提高应用程序性能,但可能会有所帮助

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

示例4-26中创建的索引是 基于函数的索引。通过评估创建基于函数的索引 表中每行的指定函数。特别是 在这种情况下,函数的结果没有用处,因此 索引本身没有用处。然而,也有许多案例被发现 基于函数的索引很有用

基于函数的索引有用的一个例子是XML 未使用结构化存储管理内容。在这种情况下,, 不再重写CREATEINDEX语句,索引将 可以通过调用XML内容和索引上的函数来创建 结果呢

给定示例4-28中创建的表,该表使用CLOB存储 以下内容不是用于持久化XML的结构化存储 CREATEINDEX语句将导致创建基于函数的索引 根据属于引用的文本节点的值创建 元素。如示例所示,此索引将强制执行唯一 对与引用关联的文本节点的值的约束 元素

示例4-28基于CLOB的XMLType()创建基于函数的索引

创建和使用基于函数的 索引是优化器只考虑何时使用索引 WHERE子句中包含的函数与函数相同 用于创建索引。

考虑示例4-29中的查询,它们都可以找到 与关联的t ext节点的基于PurchaseOrder的值 参考元素。请注意,第一个查询使用existsNode() 要定位文档,不使用索引,而使用第二个索引 使用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返回一个值 t进程。可以创建一个索引 extractValue()和extract().getStringVal()一起使用,如示例所示 4-26

示例4-26使用extract().getStringVal()创建基于 摘录()上的索引

这允许CREATEINDEX语句成功。然而,指数 所创建的不是预期的。索引是由 为中的每一行调用extract()和getStringVal()函数 表,然后根据 行的rowid

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


你能提供执行计划吗?它使用索引吗?好的,完成。但无论如何,有关性能的问题无法直接回答。
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
CREATE INDEX iLINEITEM_UPCCODE
    ON PURCHASEORDER
    ( extract(object_value,'PurchaseOrder/LineItems/LineItem/Part/@Id').getStringVal());

    Index created.