用到的表结构如下:
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));

解决方案 »

  1.   

    程序的优化是首要做的,在未了解实际运行环境的情况下,贸然建议你调整SGA是不明智的。
    就程序而言,提个小小的意见:可读性比较差,没有注释,不知道这些步骤都是在干什么。
    我认为,该程序速度慢在两重游标循环上,由于不知道你做两重游标的目的是什么,所以
    也不敢随便改动程序,能不能请贴主说明用户需求及你这么做的原因,方便大家分析。
      

  2.   

    pro*c指的是在普通的c或c++中添加了对oracle操作的功能,在pro*C同样可以调用存储过程,同样也可以完成存储过程能完成的一且功能。
    相比较而言,对于些操作量很大的数据,使用pro*C或oci会获得很大的速度提升。pl/sql比较适合于联机事务操作的一些处理,这样执行代码不会被频繁解析,可以提升一些速度在http://www.oradb.net/book.htm这里可以下载到pro*C的资料
      

  3.   

    cursor c1 用来取出buffer表中的数据,buffer表中的记录达千万条,是通话话单。cursor c2 用来取companies_code中的数据,companies_code表中的数据大概2、3百条,其中存的是电信、网通、铁通等的区号。
    循环:
    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的循环用来取话单。
    该台机器就唯一的就是用来做这个事情。
      

  4.   

    不用游标的方法,那么用什么呢?
    现在改用静态sql语句插入到固定的一张表处理速度100000条/12分钟。
    谁能帮我改善最起码快一倍。用pro*c可能么?
    实在不行,准备改用C了。原来是把文本导入数据库再做处理的。看来要把文本用先
    用C处理完了,再导入数据库才好。
      

  5.   

    能不能加一点注释,否则每个人的理解可能都会不同,读了一会我就没激情了,
    加上注释吧,这样你以后也好位户;
    现在只能给你一条建议:使用游标时每5000条提交一次,这样速度会提高的,我这边俩台PC机通过JDBC从SQL SERVER2000到ORACLE817一次提取700万数据也只是用了22分钟。
      

  6.   

    用C是最快的了
    然后用sqlldr导入