【INSERT】逐行提交、批量提交及极限提速方法

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

1.创建表t_ref,并初始化880992条数据,用于后面的实验。
[email protected]> create table t_ref as select * from all_objects;

[email protected]> insert into t_ref select * from t;

220248 rows created.

[email protected]> /
[email protected]> /
[email protected]> /
[email protected]> /
[email protected]> /

440496 rows created.

2.编写一个简单的PL/SQL块来模拟逐行提交的情况,注意观察执行时间。
我们的目标是将t_ref表中的数据全部插入到t中。
[email protected]> set timing on

[email protected]> 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.再来模拟批量提交的情况。
[email protected]> truncate table t;

Table truncated.

[email protected]> 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更高级的方法完成上面的任务,体验一下极限速度。
[email protected]> 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 --

时间: 2024-08-25 01:31:30

【INSERT】逐行提交、批量提交及极限提速方法的相关文章

FireDAC 下的 Sqlite [11] - 关于批量提交 SQL 命令的测试

可把下面代码直接贴在空白窗体上, 以快速完成窗体设计:object DBGrid1: TDBGrid Left = 0 Top = 0 Width = 265 Height = 338 Align = alLeft DataSource = DataSource1 TabOrder = 0 TitleFont.Charset = DEFAULT_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -11 TitleFont.Name

Mobile Services批量提交数据

Mobile Services批量提交数据,参考了文章:Inserting multiple items at once in Azure Mobile Services.里面其实已经介绍得比较清楚了,但由于是英文,而且有些地方交待得不清楚,也没有Android的示例,故下文以Android版本的开发为例作个补充. 首先在Mobile Services项目里新建AllToDoItems以及ToDoItem表,点击AllToDoItems,再点击script标签,将里面的内容替换如下: funct

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

1 Phoenix的批量insert官网代码,最佳实践 try (Connection conn = DriverManager.getConnection(url)) { conn.setAutoCommit(false); int batchSize = 0; int commitSize = 1000; // number of rows you want to commit per batch. try (Statement stmt = conn.prepareStatement(up

Oracle批量提交

今天在项目中碰到一个问题,就是需要批量提交10000条语句, 刚开始使用的是statement.addBatch(),结果提交的时候发现需要26秒; 检查半天,发现批量提交的时候也要关掉自动提交(重要),不然极其影响性能. 改了一下程序,最终代码如下,执行时间为1秒钟: 1 // 获取一个连接 2 Connection conn = null; 3 PreparedStatement pstm = null; 4 try { 5 conn = DBConnectionManager.getIns

转MySQL 批量提交优化

用户修改布局时,需要批量更新mysql的xxxx_layout_xxxx表.批量操作的数据量是2-30条/次.批量操作是这次项目在技术上比较关键的一个点,之前批量操作做过性能上的测试,mysql端问题不大,7000+tps,Java端的效率有些差,有优化空间. 对批量的性能进行了测试,优化.过程如下. 经测试,批量更新30条记录的时间是35ms.由于数据在mysql服务端中会有内存缓存,批量更新30条的时间用了35ms,感觉有些长,试图找出原因. 使用截包工具(这里用的ethereal),抓取m

C# httpwebrequest批量提交数据到网站。

非新文,由自己以前在baidu网站转来的.(现在百度的博客不喜欢,转来这存档.很久以前的工作笔记了) 因为工作需要要将大致300多条数据提交到网站,而网站在提交 错数据后无法正常进入相应的数据页面进行修改, 不得己自己动手开发一个. 关键字:httpwebrequest, httpwebrespone, excel ,datagradview,httpwatch.cookie 首先下载一个httpwatch安装,在IE中截获提交信息 登录流: POST /index.php/Public/che

批量提交

前台代码: 1 <a class="approve" onclick="deleteListProgram()">批量审核</a> 2 <thead> 3 <tr> 4 <th style="width: 20px;"><input type="checkbox" lay-skin="primary" class="checkAll

新站长必备 各大网站收录入口,各大搜索引擎提交, 搜索引擎提交地址

网站建设完成之后,第一件事情就是向各大搜索引擎提交新网站.已更好的分享自己的文章,获取更多的访客. 搜索引擎提交包括提交给搜索引擎爬虫和提交给分类目录. 提交给搜索引擎爬虫的目的是让搜索引擎将网站收录到索引数据库.检验网站是否被搜索引擎收录的办法是直接在搜索引擎中搜索网址,查看能否找到网站结果,也可以通过输入命令”site:hoar.me”获得具体的页面收录数量. 提交给搜索引擎分类目录有两个目的:一是为了用户通过分类目录检索到网站,二是为网站获得一个高质量的外部链接,有助于增加网站的链接广度.

git防止每次提交输入用户名与密码的方法(http方式 而不是 ssh方式)

windows下比较比较好用的git客户端有2种: 1. msysgit + TortoiseGit(乌龟git) 2. GitHub for Windows github的windows版也用过一段时间,但还是不太习惯.所以目前仍然青睐与msysgit+乌龟git的组合.TortoiseGit在提交时总数会提示你输入用户名密码,非常麻烦.解决方案如下: 方法一: 设置 -> git 编辑本地 .git/config 增加 1[credential] 2 helper = store保存,输入一