在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】逐行提交、批量提交及极限提速方法的更多相关文章

  1. MyBatis 通过 BATCH 批量提交

    本文由 简悦 SimpRead 转码, 原文地址 https://www.jb51.net/article/153382.htm 很多人在用 MyBatis 或者 通用 Mapper 时,经常会问有没 ...

  2. php中bindValue的批量提交sql语句

    php预编译sql语句,可以批量提交sql,也可以实现防注入 <?php $dsn='mysql:host=127.0.0.1;port=3306;dbname=bisai'; $usernam ...

  3. Mobile Services 提交批量数据

    Mobile Services批量提交数据,參考了文章:Inserting multiple items at once in Azure Mobile Services.里面事实上已经介绍得比較清楚 ...

  4. Scrapy 扩展中间件: 同步/异步提交批量 item 到 MySQL

    0.参考 https://doc.scrapy.org/en/latest/topics/item-pipeline.html?highlight=mongo#write-items-to-mongo ...

  5. Ext.Ajax.request批量提交表单

    介绍一下批量提交grid中数据的问题 js文件中的提交方法如下: listeners: { click: function btnClick(button) { var win = button.up ...

  6. Phoenix批量提交优化,官网的demo

    1 Phoenix的批量insert官网代码,最佳实践 try (Connection conn = DriverManager.getConnection(url)) { conn.setAutoC ...

  7. js 批量提交数据

    // 批量提交数据 let pageSize = 100, total = dataTmp.length, list = dataTmp let totalPage = Math.ceil(total ...

  8. git批量删除文件和批量提交

    1. 单个删除文件: ① 通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:(可选操作,可直接执行②删除) $ rm test.txt ② 确实要从版本库中删除该文件,那就用命令git rm ...

  9. Asp.Net Mvc表单提交(批量提交)

    Asp.Net Mvc中Action的参数可以自动接收和反序列化form表单的值, 采用form表单提交 name=value类型,只要Action参数的变量名和input的name相同就行 html ...

随机推荐

  1. struts 模块化

    <struts> <!-- 包含了三个配置文件 --> <!-- 不指定路径默认在src下时的方式 --> <include file="strut ...

  2. HDU 1394 线段树or 树状数组~

    Minimum Inversion Number Description The inversion number of a given number sequence a1, a2, ..., an ...

  3. 7 Worksheet 对象

    7.1 设置阶段 代码清单7.1:使用Parent属性获得一个对象的父对象的指针 '使用Parent属性获得一个对象的父对象的指针 Sub MeetMySingleParent() 'Declare ...

  4. 搞笑代码注释,佛祖保佑 永无BUG

    佛祖保佑 永无BUG 上传图片即可生成字符画,效果还不错, https://www.fontke.com/tool/image2ascii/ 神注释大全 https://github.com/Blan ...

  5. Linux下 CentOS 7 对比6 改动详解 及 系统安装

    系统基础服务变化 操作系统 本文CentOS7 为最新版7.5 本文CentOS6 为6.9 操作 Centos6 Centos7 对比 自动补全 只支持命令.文件名 支持命令.选项.文件名 文件系统 ...

  6. 07-11 Linux命令操作

    1. 查看当做操作目录位置    > pwd 2. 查看(当前)目录里边的文件内容    > ls                //list    > ls  -l  或ll    ...

  7. 解方程 2014NOIP提高组 (数学)

    解方程  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 输入描述 Input Description 输入文 ...

  8. LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)

    题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...

  9. C - GCD LCM

    Description The GCD of two positive integers is the largest integer that divides both the integers w ...

  10. Linux环境下安装JDK并配置环境变量

    首先查看是否已经安装了JDK并配置环境变量. [root@dhcc_plat opt]# java -version -bash: java: command not found [root@dhcc ...