一、问题产生
周五到某项目组,说到我们的系统向某国外开发系统传递XML格式的凭证数据,1W条分录,该国外开发的系统很快就能返回,几乎在1秒之内。回宾馆后,我仔细想了一下这件事,结合我部相关系统的数据导入机制,感觉这个消息似乎很有刺激性,于是乎,就想验证一下,到底能有多快。
二、问题分析
我部相关系统中的导入,大致来讲,需要以下步骤:txt-->xml-->vo-->db。影响性能的因素主要是以下两个:
1、格式转换多
2、校验多
格式转换多,一是为了校验方便,二是为了写入数据库方便(VO)。校验多,主要是保证数据一致性、完整性等,属于业务逻辑,无法省略。
某国开发的系统接受XML格式的凭证数据时,不会再做格式转换,也应该没有那么多的校验(最多校验科目在不在、借贷是否平衡等,这些校验的成本基本可以忽略),主要成本就在把xml存入数据库表中。
验证xml文件写入数据库表的速度。
三、问题验证
如果使用xml-->vo-->db的方法,在资源消耗上比较大(需要解析XML文件,并在内存中构造很多VO、REFVO等对象),也就快不起来了。所以重点放在XML直接写入到数据库表中(假设XML中的数据是完全符合数据库表要求的)。
1、建表
-- 目标表,保存最终的凭证数据
create table temp_voucher_detail (
voucher_number number,
orient integer,
subject_code varchar(200),
debit_cash number(18,2),
credit_cash number(18,2)
) tablespace NNC_DATA01;
-- 临时表,用于把xml存入到clob字段中,与我部系统中xxxx_file_up表类似。
create table temp_clob
(
id number,
xmlclob clob
)
tablespace nnc_data01;
2、造数,并把xml数据手工存入上述临时表中,11000条数据,约1.8M。示例如下:
<?xml version = '1.0'?>
11100100101200030000
11100100101200030000
11100100101200030000
。。。
3、使用pl/sql把clob写入到目标表中,代码如下:
declare
v_ctx dbms_xmlsave.ctxType;
v_rows number;
v_clob temp_clob.xmlclob%type;
begin
-- 临时表中有且仅有一条记录
select xmlclob into v_clob from temp_clob where rownum = 1;
v_ctx := dbms_xmlsave.newContext('TEMP_VOUCHER_DETAIL');
v_rows := dbms_xmlsave.insertXML(v_ctx, v_clob);
dbms_xmlsave.closeContext(v_ctx);
dbms_output.put_line('count = ' || v_rows);
commit;
end;
/
4、清理:
drop table temp_clob purge;
drop table temp_voucher_detail purge;
在我的笔记本电脑上,载入11000条数据,耗时1.5-2秒之间,与直接insert的速度差不多。CPU有一个50-60%的高点.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26802046/viewspace-719066/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26802046/viewspace-719066/