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/
,如需转载,请注明出处,否则将追究法律责任。