如何在
plsql
程序处理批量数据
.
Author:
Wenxing.zhong
Date:
2008-05-29
在
ebao
的应用程序中,有很多的业务需要通过
pl/sql
程序来处理,每天晚上可能
要运行多个
job
来处理当天,当周或者当月的数据;这些后台批处理
pl/sql
程序在
业务数据量比较少的场合基本能够在一个晚上的时间内跑完,但是随着客户业务数
据量的不断增长,部分
pl/sql
程序的执行时间不断的增长,以至于一个晚上跑不完
影响业务系统白天的正常运行,引起客户不断的抱怨,给项目组带来比较大的压
力;笔者在
income
和
taiping
项目的优化中,经历了其中的许多案例,现把优化过
程中的一些体会写下来,供各个项目组参考;
在和开发人员的交流中,开发人员不断向我抱怨,数据量太多了,我们没有办法提
高程序的处理速度,我们必须一条一条数据来进行处理,因为里面有很多的业务逻
辑处理,真的没有办法吗,不,有,只是我们没有发现,下面我罗列出一些针对批
量处理的方法,希望能够抛砖引玉,给各个开发人员开阔一些思路;
批量数据处理的一些方法:
1
,使用
oracle
批量处理的特性,如
forall,bulk
collect
;
2
,使用临时表来储存常用的一些数据,避免对大表的多次访问;
3
,使用多个
job
来并行处理;
4
,优化
sql,
提高
sql
的执行效率;
一:使用
oracle
批量处理特性:
(1)
bulk
collect
的使用:
在
ebao
的程序中经常会有这样的程序:
先声明一个游标
CURSOR
c_policy_fee
IS
SELECT
*
FROM
t_policy_fee
where
xxxxx=xxxx;
然后
For
cur_rec
in
c_policy_fee
loop
业务处理
End
loop;
在游标获取的数据量较大的场合考虑用如下的方法:
TYPE
id_type
IS
TABLE
OF
t_policy_fee.id%TYPE;
TYPE
description_type
IS
TABLE
OF
t_policy_fee.description%TYPE;
t_id
id_type;
t_description
description_type;
BEGIN
SELECT
id,
description
BULK
COLLECT
INTO
t_id,
t_description
FROM
t_policy_fee;
For
I
in
id.first
..id.last
loop
业务处理