日期:2014-05-17  浏览次数:20709 次

大家帮忙看一下,为什么效率变低了?
我的做法如下:
第一步:插入用户ID
          insert   orders   (user_id)   (
                        select
                                      user_id  
                        from
                                users
                        where
                                sum_date=20070912
          );
          commit;          
操作结束后orders表将会有200万条记录
第二步:使用一个procedure更新orders表其他字段,基本内容如下
          for   c_step2   in   (
                    select
      user_id,
      sum(product_fee)   fee_all,
      sum(product_num)   product_all,
      .
      .
      .  
                    from
                              sell_his
                    where
                                sum_month   between   200706   and   200708
                    group   by
                                user_id
          )
          loop
                  update   orders   set     fee_all=c_step2.fee_all,     product_all=c_step2.product_all,
    .
    .
    .
                  where
                            user_id=c_step2.user_id;
          end   loop;
          commit;
当以上两个步骤单独执行时,速度还可以接受,基本上10分钟以内可以结束,但是当我把它们写入同一个procedure中时,第一步的执行时间大约为1分钟左右,但是第二步却需要超过40分钟,以上代码在写入同一个procedure没有任何改动,但是为什么效率差别这么大呢?我接触ORACLE的时间不长,希望大家指点一下,谢谢。

------解决方案--------------------
把你二步放在一起的过程贴出来看看,怀疑有锁表。
------解决方案--------------------
我觉得最大的分歧就在于第一次递交后 commit; 了。
第二种方法,200w条记录没有commit,占有了大量的内存。