【问题标题】:Importing/Loading large XML files into Oracle将大型 XML 文件导入/加载到 Oracle
【发布时间】:2014-03-26 15:27:59
【问题描述】:

我在将非常大的 XML 文件加载到 Oracle DB (80MB) 时遇到问题。 XML 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<names>
<catalog>
<row>
<col name="NAME">John</col>
<col name="SURNAME">Smith</col>
<col name="AGE">24</col>
</row>
<row>
<col name="NAME">Matt</col>
<col name="SURNAME">Lick</col>
<col name="AGE">14</col>
</row>
</catalog>
</names>

我试图让它工作的代码如下所示:

CREATE directory TEST_DIR  AS 'c:\Test';

INSERT INTO NAMES(NAME,SURNAME,AGE)
WITH t AS (SELECT xmltype(bfilename('TEST_DIR','NAMES.xml'), nls_charset_id('UTF8'))     xmlcol FROM dual)
SELECT extractValue(value(x),'/row/col[@name="NAME"]') NAME         
,extractValue(value(x),'/row/col[@name="SURNAME"]') SURNAME  
,extractValue(value(x),'/row/col[@name="AGE"]') AGE

FROM t,TABLE(XMLSequence(extract(t.xmlcol,'/names/catalog/row'))) x;

我得到的是无限循环(我等待了 4 小时以请求结束。)当我尝试使用像 40MB 这样的小一点的文件时,它起作用了——我得到的信息是在 253 秒内插入了 160 000 条记录。 是否有任何参数或其他东西可以使此导入也适用于更大的文件?我做错了什么?

干杯

【问题讨论】:

    标签: sql xml oracle load


    【解决方案1】:

    当您使用 extractValuexmltype 之类的函数时,XML 将在 DOM(文档对象模型)方法上进行解析。一旦我读到关于因子 10-20 的内容,这会在内存中产生很大的开销!一般来说,如果 XML 文档大于“两位数 MB 的上限”,则使用 DOM 解析器解析它们是不明智的。

    对于大型文档,您必须使用基于流的解析器,通常是 SAX 解析器。大多数情况下编码比较多,但是文档的结构很简单,应该没问题。

    在我的应用程序中,我必须将最大 1 GB 的 XML 文件加载到我的 Oracle DB 中,我使用 XML::Twig 在 Perl 中编写了解析器,它运行良好。

    【讨论】:

    • 感谢您的帮助!我写了一些 STAX java 解析器,它运行起来非常快速流畅!谢谢
    【解决方案2】:

    存储为安全文件二进制 xml,以便您获得它提供的优化。

    CREATE TABLE xxx ( xml_file XMLTYPE ) XMLTYPE xml_file STORE as securefile binary xml;
    
    INSERT INTO xxx ( xml_file ) 
    ( SELECT XMLTYPE(bfinename(<directory object>,<file name>, nls_charset_id(<character set>)) from dual ); 
    

    这里我建议将 xml 中的

    更改为 ??>???> 以使您的生活更轻松。
    SELECT name, surname, age
    FROM XMLTABLE('/names/catalog/row' passing (SELECT xml_file FROM xxx) 
                   COLUMNS name VARCHAR2(4000),
                           surname VARCHAR2(4000),
                           age NUMBER);
    

    【讨论】:

      猜你喜欢
      • 2011-07-21
      • 1970-01-01
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2015-06-08
      • 2018-12-17
      相关资源
      最近更新 更多