ITPub博客

首页 > 数据库 > Oracle > oracle 存储过程批量提交

oracle 存储过程批量提交

原创 Oracle 作者:abin1703 时间:2016-10-17 09:50:02 0 删除 编辑
1.
create table t_ref as select * from all_objects;

insert into t_ref select * from t;
insert into t_ref select * from t;
insert into t_ref select * from t;
insert into t_ref select * from t;
insert into t_ref select * from t;

2.模拟逐行提交的情况,注意观察执行时间
目标是将t_ref表中的数据全部插入到t中
set timing on

DECLARE
BEGIN
FOR cur IN (SELECT * FROM t_ref) LOOP
INSERT INTO t VALUES cur;
COMMIT;
END LOOP;
END;
/


3分

3.模拟批量提交
truncate table t;

DECLARE
v_count NUMBER;
BEGIN
FOR cur IN (SELECT * FROM t_ref) LOOP
INSERT INTO t VALUES cur;
v_count := v_count + 1;
IF v_count >= 100 THEN
COMMIT;
v_count:=0;

END IF;
END LOOP;
COMMIT;
END;
/




1分多,大约是逐行提交方法一半的时间

4.更高级的方法,体验一下极限速度。
DECLARE
CURSOR cur IS
SELECT * FROM t_ref;
TYPE rec IS TABLE OF t_ref%ROWTYPE;
recs rec;
BEGIN
OPEN cur;
WHILE (TRUE) LOOP
FETCH cur BULK COLLECT
INTO recs LIMIT 100;
FORALL i IN 1 .. recs.COUNT
INSERT INTO t VALUES recs (i);
COMMIT;
EXIT WHEN cur%NOTFOUND;
END LOOP;
CLOSE cur;
END;
/


DECLARE
v_count NUMBER;
BEGIN
FOR cur IN ( select * from gsinfo.t_order_backup where query_info='MonitorAdd' and substr(order_no ,21,22) in (1,5) ) LOOP
update gsinfo.t_order_backup set state='1' where query_info=cur.query_info and order_no=cur.order_no;
v_count := v_count + 1;
IF v_count >= 100 THEN
COMMIT;
END IF;
END LOOP;
COMMIT;
END;
/


频繁的COMMIT会引起大量Redo Log的物理I/O,会极大的限制数据库的性能
因此,为提高数据库性能,尽可能的批量提交。
Oracle有很多优秀的方法值得尝试

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30345407/viewspace-2126548/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-07-13

  • 博文量
    204
  • 访问量
    426805