【发布时间】:2019-11-03 22:43:28
【问题描述】:
我有一个返回 5000 万行的查询。我想为每一行生成 XML 文件(文件最大大小为 100k)。我当然知道标签,但我不知道如何以最有效的方式编写它。有什么帮助吗?
谢谢
【问题讨论】:
-
您要创建 50M 文件吗?这听起来有点奇怪。你到底想完成什么?也许还有其他解决方案。
标签: sql xml oracle performance
我有一个返回 5000 万行的查询。我想为每一行生成 XML 文件(文件最大大小为 100k)。我当然知道标签,但我不知道如何以最有效的方式编写它。有什么帮助吗?
谢谢
【问题讨论】:
标签: sql xml oracle performance
我不建议尝试将 50M 文件写入磁盘,但您可以使用以下代码来演示为什么这不是一个好主意
1:使用目录将文件写入磁盘的函数
create or replace function WRITETOFILE (dir in VARCHAR2,fn in VARCHAR2, dd IN clob) return clob AS
ff UTL_FILE.FILE_TYPE;
l_amt number := 30000;
l_offset number := 1;
l_length number := nvl(dbms_lob.getlength(dd),0);
buf varchar2(30000);
begin
ff := UTL_FILE.FOPEN(dir,fn,'W',32760);
while ( l_offset < l_length ) loop
buf := dbms_lob.substr(dd,l_amt,l_offset);
utl_file.put(ff, buf);
utl_file.fflush(ff);
utl_file.new_line(ff);
l_offset := l_offset+length(buf);
end loop;
UTL_FILE.FCLOSE(ff);
return dd;
END WRITETOFILE;
/
2:使用上述函数的查询创建包含所有行的表的语句 - 建议您保持较小的行数以查看其运行方式
create table tmptbl as
select writetofile('DMP_DIR','xyz-'||level||'.xml', xmlelement("x", level).getClobVal()) tmpcol, systimestamp added_at
from dual CONNECT BY LEVEL <= 10;
3:删除表以重复创建具有更多行的表语句
drop table tmptbl purge;
我在 10 秒内处理了 10k 个文件 - 1M 文件需要 1000 秒,50M 文件需要 50000 秒(即不到 14 小时)。
【讨论】: