我有一个要求,我必须处理巨大的 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 文件需要多少时间。有人可以建议我如何提高数据库的性能。由于我是新手,我不确定我是否以正确的方式进行操作。如果有更好的解决方案请提出建议。对你的帮助表示感谢。