数据处理流程:
1、先将数据导入的临时表terminal_sell_temp 。
2、更新业务基础表,有两个表MV_AREA_TID_LOTTERY_DAY,MV_AREA_TID_LOTTERY_TERM 。这两个表的记录总数是3千万
3、更新其它业务基础表,有37个。使用oracle job来更新,执行的入口函数代码如下:
    update terminal_sell_temp set STATUS=1; 
    --处理基础视图
    Proc_MV_AREA_TID_LOTTERY_DAY();
    Proc_MV_AREA_TID_LOTTERY_TERM();
    --按时间段处理视图
    proc_day();
    proc_term();
    proc_week();
    proc_month();
    proc_quarter();
    proc_year();更新业务表的代码如下:
   for idx in( select  distinct sell_end_time   from terminal_sell_temp   where  STATUS=1) loop
       --处理mv_area_tid_day
       begin
         execute immediate ' delete mv_area_tid_day where sell_day='''||to_char(idx.sell_end_time,'yyyy-mm-dd')||'''' ;  --删除当日数据,从新更新
         execute immediate ' insert into mv_area_tid_day  '||
         ' select sum(sell_amount) sell_amount,sum(sell_count) sell_count, '||
         ' round(decode(sum(sell_count), 0,  0,  sum(sell_amount) / sum(sell_count)),  2) ticket_sell, '||
         ' area_id, area_name,sell_id, sell_day from mv_area_tid_lottery_day where sell_day='''||to_char(idx.sell_end_time,'yyyy-mm-dd')||''''||
         ' group by sell_id,sell_day,area_id,area_name ';         mvlog.note:='更新mv_area_tid_day表的数据完成';
         mvlog.datetime:=sysdate;
         mvlog.procname:='pkg_procimportdata.proc_day';
         write_mvlog(mvlog); --添加日志
       exception
         when others then
           begin
              dbms_output.put_line(sqlerrm);
              mvlog.note:='更新mv_area_tid_day表的数据时出错'||sqlerrm;
              mvlog.datetime:=sysdate;
              mvlog.procname:='pkg_procimportdata.proc_day';
              write_mvlog(mvlog); --添加日志
           end;   
       end;
end loop;请问我该怎么优化...

解决方案 »

  1.   

    动态SQL,使用变量绑定。execute immediate ... using var1,var2 ...
      

  2.   

    execute immediate  执行是不是不同步的,比如同时执行N个execute immediate <sql>,有可能最后一个执行的语句先结束,怎么样让execute immediate 按顺序执行,执行完一个语句再执行下一个语句?
      

  3.   

    只要你写在同一个PL/SQL块里,其执行是按顺序来的。只有前面的执行完毕,才会执行后面的。
    当然,在IF ... ELSE里,有些语句也可能不执行。
      

  4.   

    好像不是这样的,因为语句的服务器端执行,存储程过把这语句一执行,它就执行下面的语句了,而不管在服务器端的sql何时执行完
      

  5.   


    你把ORACLE想的太不负责任了。。
      

  6.   

    execute immediate   sql1;
    execute immediate   sql2;
    这样一个代码段,oracle是先执行完sql1再执行sql2?确认不?