Database oracle10g中的XMLType
我们必须将xml存储在oracle数据库中,因为我使用XMLType作为其中一列的数据类型。现在表中有40000条记录,我正在使用“extractValue”函数获取xml记录。获取记录查询需要14秒。在下面的查询中查找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.
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.