第一份工玩MSSQL,第二份玩DB2,第三份ORACLE,快玩遍了……
闲话少说,转入正题:
最近在写一个SP,每天往一个结果表更新数据,数据量大约200万行上下。
原来想用MERGE去做,不过MERGE似乎无法做到把已删除的记录同步删除,只能insert和update,所以不行。也可能是我不懂怎么删,如有办法的朋友请指教。
后来就想先删除旧数据再插回去,不过肯定要做成分段commit啦……于是写了这段语句(只是insert的部分),原意是想每计数2000次就commit一次,可是实际跑这个SP,发现一直都没有做commit,搞不懂哪里写错了,请各位指点迷津,谢谢!V_ROW NUMBER:=0;for r_cur in (select a from tbl) loop  V_ROW:=V_ROW+1;  insert into tbl_target 
  select * from tbl_source where f1=r_cur.a;
  --这句每次只会插入大约200条记录
  
  if MOD(V_ROW,2000)=0 then
    commit;
  end if;end loop;
commit;

解决方案 »

  1.   

    数据再多也不要分段提交吧???
    耗时间的就是INSERT提交很快吧
      

  2.   

    --试一下:For i in 1..2000000
    Loop
    insert into tbl_target 
      select * from tbl_source where f1=i; 
    If mod(i, 2000) = 0 then
    Commit;
    End if;
    End loop;
    commit;
      

  3.   

    我用emp表做了个测试语法完全没问题。
    你检查下
    我按照你的写了个测试的,完全没问题。
    declare 
    V_ROW NUMBER:=0;
    begin
    for r_cur in (select empno from emp) loop  V_ROW:=V_ROW+1;  insert into temp_emp
      select * from emp where empno=r_cur.empno;
      --这句每次只会插入大约200条记录
     
      if MOD(V_ROW,10)=0 then
        commit;
      end if;
    end loop;
    commit;
    end;
      

  4.   

    Thanks for all uppers' help!It seems that it's really a performance issue rather than a misleading script issue?Wait for more discussion & suggestion......
      

  5.   

    我一般会这样写V_ROW NUMBER := 0;
      FOR R_CUR IN (SELECT A FROM TBL) LOOP
        V_ROW := V_ROW + 1;
        INSERT INTO TBL_TARGET
          SELECT * FROM TBL_SOURCE WHERE F1 = R_CUR.A;  
        IF V_ROW = 2000 THEN
          V_ROW := 0;
          COMMIT;
        END IF;
      END LOOP;
      COMMIT;
      

  6.   

    好像根本不需要用游标和循环,一句就可以搞定:
    INSERT INTO TBL_TARGET
          SELECT * FROM TBL_SOURCE,TBL WHERE TBL_SOURCE.F1=TBL.A; 
      

  7.   

    循环提交万一中间出问题,都不知道进行到那里,恢复都很麻烦,而且据tom的书里面说单条sql语句的性能比你这样要好
      

  8.   

    谢谢楼上各位!!假设我的例子不用游标,用个日期做循环参数,但还是有200万行数据。一次insert后commit的效率高?还是逐天commit(大约100天)效率高?我个人觉得应该是后者效率高很多,对吗?
      

  9.   

    自己测试一下就知道了,估计是一次insert的好点
      

  10.   


    基本上是差不多的!commit100次也花不了多少时间的。