第一份工玩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;
闲话少说,转入正题:
最近在写一个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;
耗时间的就是INSERT提交很快吧
Loop
insert into tbl_target
select * from tbl_source where f1=i;
If mod(i, 2000) = 0 then
Commit;
End if;
End loop;
commit;
你检查下
我按照你的写了个测试的,完全没问题。
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;
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;
INSERT INTO TBL_TARGET
SELECT * FROM TBL_SOURCE,TBL WHERE TBL_SOURCE.F1=TBL.A;
基本上是差不多的!commit100次也花不了多少时间的。