用到的表结构如下:
create table buffer
(
streamnumber varchar2(20),
scpid varchar2(20),
locationnumber varchar2(20),
chargerecordedenti varchar2(20),
chargepartingdica varchar2(20),
specificchargedpar varchar2(20),
typeoftraffic varchar2(20),
causeofcallend varchar2(20),
insurcharge varchar2(20),
chargemodulator varchar2(20),
transparentparanet varchar2(20),
servicekey number(8) not null,
chargemode number(2) not null,
chargeclass number(8) not null,
callcost number(8) not null,
caller varchar2(20) not null,
callee varchar2(20) not null,
called varchar2(20) not null,
startdateandtime varchar2(14) not null,
enddateandtime varchar2(14) not null,
duration varchar2(8) not null
flag varchar2(4);
flagi number(4);
);
call_intellective 、call_pre_pay、call_201等所指向的表就是在buffer的基础上增加
(
p_duration number(8),callee_subsidiaryid number(9),caller_subsidiaryid number(9),caller_type varchar2(32),callee_company varchar2(32)这些字段。create table errors_log(errorid number(5),errortime date,jobname varchar2(128),sys_err_info varchar2(256));
create table buffer
(
streamnumber varchar2(20),
scpid varchar2(20),
locationnumber varchar2(20),
chargerecordedenti varchar2(20),
chargepartingdica varchar2(20),
specificchargedpar varchar2(20),
typeoftraffic varchar2(20),
causeofcallend varchar2(20),
insurcharge varchar2(20),
chargemodulator varchar2(20),
transparentparanet varchar2(20),
servicekey number(8) not null,
chargemode number(2) not null,
chargeclass number(8) not null,
callcost number(8) not null,
caller varchar2(20) not null,
callee varchar2(20) not null,
called varchar2(20) not null,
startdateandtime varchar2(14) not null,
enddateandtime varchar2(14) not null,
duration varchar2(8) not null
flag varchar2(4);
flagi number(4);
);
call_intellective 、call_pre_pay、call_201等所指向的表就是在buffer的基础上增加
(
p_duration number(8),callee_subsidiaryid number(9),caller_subsidiaryid number(9),caller_type varchar2(32),callee_company varchar2(32)这些字段。create table errors_log(errorid number(5),errortime date,jobname varchar2(128),sys_err_info varchar2(256));
就程序而言,提个小小的意见:可读性比较差,没有注释,不知道这些步骤都是在干什么。
我认为,该程序速度慢在两重游标循环上,由于不知道你做两重游标的目的是什么,所以
也不敢随便改动程序,能不能请贴主说明用户需求及你这么做的原因,方便大家分析。
相比较而言,对于些操作量很大的数据,使用pro*C或oci会获得很大的速度提升。pl/sql比较适合于联机事务操作的一些处理,这样执行代码不会被频繁解析,可以提升一些速度在http://www.oradb.net/book.htm这里可以下载到pro*C的资料
循环:
for m_c2 in c2 loop --程序要求在维护companies_codes表的时候,表中不能存在一项可被另一项包含的情况
if substr(m_c1.caller,4,length(m_c2.netnumber))=m_c2.netnumber then m_caller_subsidiaryid:=m_c2.subsidiaryid; m_caller_type:=m_c2.codetype;
end if;
if substr(m_c1.callee,1,length(m_c2.netnumber))=m_c2.netnumber then m_callee_subsidiaryid:=m_c2.subsidiaryid;
m_callee_company:=m_c2.name;
end if;
exit when m_caller_subsidiaryid is not null and m_callee_subsidiaryid is not null;
end loop;用来判定一条话单的主叫号码的类型、区号;被叫号码的区号、公司。
c1的循环用来取话单。
该台机器就唯一的就是用来做这个事情。
现在改用静态sql语句插入到固定的一张表处理速度100000条/12分钟。
谁能帮我改善最起码快一倍。用pro*c可能么?
实在不行,准备改用C了。原来是把文本导入数据库再做处理的。看来要把文本用先
用C处理完了,再导入数据库才好。
加上注释吧,这样你以后也好位户;
现在只能给你一条建议:使用游标时每5000条提交一次,这样速度会提高的,我这边俩台PC机通过JDBC从SQL SERVER2000到ORACLE817一次提取700万数据也只是用了22分钟。
然后用sqlldr导入