【INSERT】逐行提交、批量提交及极限提速方法
在Oracle数据库中,不是提交越频繁越好。恰恰相反,批量提交可以得到更好的性能。这篇文章给大家简单展示一下在Oracle数据库中逐行提交于批量提交两者之间的性能差别。最后再给出一种可以极大改变性能的方法。
1.创建表t_ref,并初始化880992条数据,用于后面的实验。
sec@ora10g> create table t_ref as select * from all_objects;
sec@ora10g> insert into 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,会极大的限制数据库的性能。因此,为提高数据库性能,尽可能的批量提交。
Oracle有很多优秀的方法值得尝试。
Good luck.
-- The End --
【INSERT】逐行提交、批量提交及极限提速方法的更多相关文章
- MyBatis 通过 BATCH 批量提交
本文由 简悦 SimpRead 转码, 原文地址 https://www.jb51.net/article/153382.htm 很多人在用 MyBatis 或者 通用 Mapper 时,经常会问有没 ...
- php中bindValue的批量提交sql语句
php预编译sql语句,可以批量提交sql,也可以实现防注入 <?php $dsn='mysql:host=127.0.0.1;port=3306;dbname=bisai'; $usernam ...
- Mobile Services
提交批量数据
Mobile Services批量提交数据,參考了文章:Inserting multiple items at once in Azure Mobile Services.里面事实上已经介绍得比較清楚 ...
- Scrapy 扩展中间件: 同步/异步提交批量 item 到 MySQL
0.参考 https://doc.scrapy.org/en/latest/topics/item-pipeline.html?highlight=mongo#write-items-to-mongo ...
- Ext.Ajax.request批量提交表单
介绍一下批量提交grid中数据的问题 js文件中的提交方法如下: listeners: { click: function btnClick(button) { var win = button.up ...
- Phoenix批量提交优化,官网的demo
1 Phoenix的批量insert官网代码,最佳实践 try (Connection conn = DriverManager.getConnection(url)) { conn.setAutoC ...
- js 批量提交数据
// 批量提交数据 let pageSize = 100, total = dataTmp.length, list = dataTmp let totalPage = Math.ceil(total ...
- git批量删除文件和批量提交
1. 单个删除文件: ① 通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:(可选操作,可直接执行②删除) $ rm test.txt ② 确实要从版本库中删除该文件,那就用命令git rm ...
- Asp.Net Mvc表单提交(批量提交)
Asp.Net Mvc中Action的参数可以自动接收和反序列化form表单的值, 采用form表单提交 name=value类型,只要Action参数的变量名和input的name相同就行 html ...
随机推荐
- struts 模块化
<struts> <!-- 包含了三个配置文件 --> <!-- 不指定路径默认在src下时的方式 --> <include file="strut ...
- HDU 1394 线段树or 树状数组~
Minimum Inversion Number Description The inversion number of a given number sequence a1, a2, ..., an ...
- 7 Worksheet 对象
7.1 设置阶段 代码清单7.1:使用Parent属性获得一个对象的父对象的指针 '使用Parent属性获得一个对象的父对象的指针 Sub MeetMySingleParent() 'Declare ...
- 搞笑代码注释,佛祖保佑 永无BUG
佛祖保佑 永无BUG 上传图片即可生成字符画,效果还不错, https://www.fontke.com/tool/image2ascii/ 神注释大全 https://github.com/Blan ...
- Linux下 CentOS 7 对比6 改动详解 及 系统安装
系统基础服务变化 操作系统 本文CentOS7 为最新版7.5 本文CentOS6 为6.9 操作 Centos6 Centos7 对比 自动补全 只支持命令.文件名 支持命令.选项.文件名 文件系统 ...
- 07-11 Linux命令操作
1. 查看当做操作目录位置 > pwd 2. 查看(当前)目录里边的文件内容 > ls //list > ls -l 或ll ...
- 解方程 2014NOIP提高组 (数学)
解方程 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 输入描述 Input Description 输入文 ...
- LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)
题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...
- C - GCD LCM
Description The GCD of two positive integers is the largest integer that divides both the integers w ...
- Linux环境下安装JDK并配置环境变量
首先查看是否已经安装了JDK并配置环境变量. [root@dhcc_plat opt]# java -version -bash: java: command not found [root@dhcc ...