【问题标题】:Performance tuning for extractvalue in oracle 10goracle 10g中extractvalue的性能调优
【发布时间】:2013-09-12 10:18:17
【问题描述】:

有一个 XML 文件 (20MB),当我尝试使用 EXTRACTVALUE 从表中使用 select 语句提取值时,它需要很长时间(小时)。 该表包含 XML_DATA 作为 XMLTYPE 请建议我调整 SQL QUERY 或任何其他替代方法以从大型 xml 文件中提取值

SELECT EXTRACTVALUE (VALUE (Name),'*/Name') FirstName,  
.....   
FROM TB_XML_type,TABLE (XMLSEQUENCE (EXTRACT (xml_data, '*/Name'))) Name

注意: XML 格式是用户定义的。

【问题讨论】:

  • 对于那种大小的 XML 文档,我会考虑使用 SAX。 DOM 不能很好地处理这种大小的文档。遗憾的是,大多数(如果不是全部)PL/SQL XML API 都是基于 DOM 的,因此您可能不得不使用 Java 存储过程或将 XML 处理移到数据库之外。下面是一个如何使用 Java 存储过程将 XML 文档解析为 SAX 的示例,您可能能够适应:forums.oracle.com/message/1389286#1389286
  • 感谢您的建议。我将尝试使用 Java 存储过程。

标签: sql xml oracle


【解决方案1】:

设置一个像你这样的桌子:

CREATE TABLE TB_XML_TYPE(XML_DATA XMLTYPE);

INSERT INTO TB_XML_TYPE(XML_DATA) 
VALUES (XMLTYPE('<a><Name>name1</Name><Name>name2</Name></a>'));

我猜 Name 元素就在 XML 的根元素之下。如果是这样的话,这可能会更快。

SELECT XD.NAME FROM TB_XML_TYPE XT, 
    XMLTABLE('/a/Name' PASSING XT.XML_DATA
        COLUMNS NAME VARCHAR2(100) PATH 'text()') XD

结果:

NAME                                                                                               
---------------------
name1                                                                                                
name2                                                                                                

如果不是,请确保 repeated 路径就在 XMLTABLE 之后 - 这是查找所有父元素的 XPath,然后您在 PATH 关键字之后使用 XPath 读取其子元素。在这种情况下,text() 会读取 Name 元素的文本内容。

【讨论】:

  • 我也尝试过使用 XMLTABLE 语法,但执行查询所需的时间仍然与使用早期语法一样。
  • 我也尝试过使用 XMLTABLE 语法,但执行查询所需的时间仍然与使用早期语法一样。
猜你喜欢
  • 2016-06-25
  • 2013-03-17
  • 1970-01-01
  • 2010-10-08
  • 2011-04-25
  • 2011-10-05
  • 2018-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多