2

我有一个要求,我必须处理巨大的 XML 文件。这意味着可能有大约 1000 个 xml 文件,这些文件的总大小约为 2GB。

我需要将这些文件中的所有数据存储到我的 Oracle DB 中。为此,我使用 sqlloader 将所有 XML 文件批量上传到我的数据库,并将其作为二进制 XMLTYPE 存储在我的数据库中。现在我需要查询这些文件并将数据存储在关系表中。为此,我使用了 XMLTable Xpath查询。当我尝试在我的数据库中查询单个 xml 文件时,一切都很好。但是,如果它试图查询所有这些文件,则会花费太多时间,这是不可接受的。

这是我的一个示例 xml 内容:

 <ABCD>
  <EMPLOYEE id="11" date="25-Apr-1983"> 
    <NameDetails> 
      <Name NameType="a"> 
        <NameValue> 
          <FirstName>ABCD</FirstName> 
          <Surname>PQR</Surname> 
          <OriginalName>TEST1</OriginalName> 
          <OriginalName>TEST2</OriginalName> 
        </NameValue> 
      </Name> 
      <Name NameType="b"> 
        <NameValue> 
          <FirstName>TEST3</FirstName> 
          <Surname>TEST3</Surname> 
        </NameValue> 
        <NameValue> 
          <FirstName>TEST5</FirstName> 
          <MiddleName>TEST6</MiddleName> 
          <Surname>TEST7</Surname> 
          <OriginalName>JAB1</OriginalName> 
        </NameValue> 
        <NameValue> 
          <FirstName>HER</FirstName> 
          <MiddleName>HIS</MiddleName> 
          <Surname>LOO</Surname> 
        </NameValue> 
      </Name>
      <Name NameType="c"> 
        <NameValue> 
          <FirstName>CDS</FirstName> 
          <MiddleName>DRE</MiddleName> 
          <Surname>QWE</Surname> 
        </NameValue> 
        <NameValue> 
          <FirstName>CCD</FirstName> 
          <MiddleName>YTD</MiddleName> 
          <Surname>QQA</Surname> 
        </NameValue> 
        <NameValue> 
          <FirstName>DS</FirstName> 
          <Surname>AzDFz</Surname> 
        </NameValue> 
      </Name> 
    </NameDetails> 
  </EMPLOYEE >
</ABCD>

请注意,这只是一个大 xml 中的一个小记录。每个 xml 将包含大约 5000 个类似的记录。同样有超过 400 个文件,每个文件大小约为 4MB。

我的 xmltype 查询:

SELECT t.personid, t.firstname, t.middlename,
           t.surname,t.maidenname,
           replace(replace(t.originalName, '<OriginalName>'),
                   '</OriginalName>', ' ') originalName
    FROM xml_files p,
         XMLTABLE (
          --'ABCD/EMPLOYEE/NameDetails/Name/NameValue'
          'for $i in ABCD/EMPLOYEE/NameDetails/Name/NameValue
           return <row>
                     {$i/../../../@id}
                     {$i/../@NameType}
                     {$i/FirstName}{$i/MiddleName}{$i/OriginalName}
                     {$i/Surname}{$i/MaidenName}
                 </row>'
         PASSING p.filecontent
         COLUMNS
                 personid     NUMBER         PATH '@id',
                 nametypeid   VARCHAR2(255)  PATH '@NameType',
                 firstname    VARCHAR2(4000) PATH 'FirstName',
                 middlename   VARCHAR2(4000) PATH 'MiddleName',
                 surname      VARCHAR2(4000) PATH 'Surname',
                 maidenname   VARCHAR2(4000) PATH 'MaidenName',
                 originalName XMLTYPE        PATH 'OriginalName'
                 ) t;

但这需要太多时间来查询所有这些庞大的数据。此查询的结果集将返回大约数百万行。我尝试使用此查询索引表:

CREATE INDEX myindex_xmlperson on xml_files(filecontent) indextype is xdb.xmlindex 
parameters ('paths(include(ABCD/EMPLOYEE/NameDetails/Name/NameValue))');

索引已创建,但性能仍然没有改善。查询一组 10 个类似的 xml 文件也需要 20 多分钟。现在您可以想象查询所有这 1000 个 xml 文件需要多少时间。有人可以建议我如何提高数据库的性能。由于我是新手,我不确定我是否以正确的方式进行操作。如果有更好的解决方案请提出建议。对你的帮助表示感谢。

4

1 回答 1

0

几个月过去了,没有人回答你的问题。我也没有给你一个具体的答案,但我至少可以为你指出这些额外的资源,以防你没有尝试过它们:

于 2013-08-18T18:39:13.920 回答