ORACLE insert 性能比较

ORACLE insert 性能比较

在Oracle数据库中,不是提交越频繁越好。恰恰相反,批量提交可以得到更好的性能。这篇文章给大家简单展示一下在Oracle数据库中逐行提交于批量提交两者之间的性能差别。最后再给出一种可以极大改变性能的方法。

1.创建表t_ref,并初始化880992条数据,用于后面的。实验

sec@ora10g> create table t_ref as select * from all_objects;

sec@ora10g>insertinto t_ref select * from t;

220248 rows created.

sec@ora10g> /

sec@ora10g> /

sec@ora10g> /

sec@ora10g> /

sec@ora10g> /

440496 rows created.

2.编写一个简单的PL/SQL块来模拟逐行提交的情况,注意观察执行时间。

我们的目标是将t_ref表中的数据全部插入到t中。

sec@ora10g> set timing on

sec@ora10g> DECLARE

2 BEGIN

3 FOR cur IN (SELECT * FROM t_ref) LOOP

4 INSERT INTO t VALUES cur;

5 COMMIT;

6 END LOOP;

7 END;

8 /

PL/SQL procedure successfully completed.

Elapsed: 00:03:12.77

逐行提交的情况下,一共用时3分12秒。

3.再来模拟批量提交的情况。

sec@ora10g> truncate table t;

Table truncated.

sec@ora10g> DECLARE

2 v_count NUMBER;

3 BEGIN

4 FOR cur IN (SELECT * FROM t_ref) LOOP

5 INSERT INTO t VALUES cur;

6 v_count := v_count + 1;

7 IF v_count >= 100 THEN

8 COMMIT;

9 END IF;

10 END LOOP;

11 COMMIT;

12 END;

13 /

PL/SQL procedure successfully completed.

Elapsed: 00:01:27.69

此时共用时1分27秒,大约是逐行提交方法一半的时间。由此可见,对于Oracle应该尽量以批量提交的方式来完成工作。

4.最后我们使用Oracle更高级的方法完成上面的任务,体验一下极限速度。

sec@ora10g> DECLARE

2 CURSOR cur IS

3 SELECT * FROM t_ref;

4 TYPE rec IS TABLE OF t_ref%ROWTYPE;

5 recs rec;

6 BEGIN

7 OPEN cur;

8 WHILE (TRUE) LOOP

9 FETCH cur BULK COLLECT

10 INTO recs LIMIT 100;

11 FORALL i IN 1 .. recs.COUNT

12 INSERT INTO t VALUES recs (i);

13 COMMIT;

14 EXIT WHEN cur%NOTFOUND;

15 END LOOP;

16 CLOSE cur;

17 END;

18 /

Elapsed: 00:00:09.75

此时我们仅仅使用了不到10秒的时间就完成了曾经需要几分钟才能完成的任务。

5.小结

在Oracle数据库中,频繁的COMMIT会引起大量Redo Log的物理I/O,会极大的限制的性能。因此,为提高数据库性能,尽可能的批量提交数据库

相关推荐
jnrjian2 天前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle
TTc_2 天前
oracle中的union和union all有什么区别?
数据库·oracle
山峰哥2 天前
吃透 SQL 优化:告别慢查询,解锁数据库高性能
服务器·数据库·sql·oracle·性能优化·编辑器
南 阳2 天前
Python从入门到精通day37
数据库·python·oracle
轩情吖2 天前
MySQL库的操作
android·数据库·mysql·oracle·字符集·数据库操作·编码集
脱发的老袁2 天前
【数据库】Oracle手动清理归档日志
数据库·oracle
jnrjian2 天前
Oracle 共享池 库缓存下的 Library Cache Lock
数据库·缓存·oracle
新缸中之脑3 天前
在Reddit上探索未满足的需求
数据库·oracle
light blue bird3 天前
产线多并发客户端指令操作场景组件
jvm·oracle·.net·winform