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,会极大的限制的性能。因此,为提高数据库性能,尽可能的批量提交。数据库
Oracle有很多优秀的方法值得尝试。

转自:http://space.itpub.net/?uid-16566331-action-viewspace-itemid-670286

根据提供的引用内容,优化Oracle数据库insert性能可以从以下几个方面入手: 1. 确保表结构和索引的设计合理:合理的表结构和索引设计可以提高插入性能。例如,使用适当的数据类型、避免过多的索引和冗余的列等。 2. 批量插入数据:使用批量插入语句(如INSERT INTO ... SELECT)可以减少插入操作的次数,从而提高性能。同时,可以考虑使用绑定变量来减少SQL语句的解析次数。 3. 禁用或延迟索引:在大批量插入数据时,可以考虑禁用或延迟索引的创建。这样可以减少插入操作的开销,待数据插入完成后再重新启用或创建索引。 4. 使用并行插入:对于大规模数据插入,可以考虑使用并行插入(Parallel Insert)来提高性能。通过并行插入,可以将数据分成多个块并同时插入,从而充分利用多核处理器的性能。 5. 调整日志模式:根据实际需求,可以调整数据库的日志模式。例如,将日志模式从完全恢复模式(Full Recovery Mode)切换为简单恢复模式(Simple Recovery Mode),可以减少日志的写入,提高插入性能。 6. 调整数据库参数:根据实际情况,可以调整数据库的相关参数来优化插入性能。例如,增加SGA和PGA的大小、调整日志缓冲区的大小等。 7. 使用并行DML:对于大规模数据插入,可以考虑使用并行DML(Parallel DML)来提高性能。通过并行DML,可以将插入操作并行执行,从而加快插入速度。 8. 使用分区表:对于频繁插入数据的表,可以考虑使用分区表来提高插入性能。通过将数据分散到不同的分区中,可以减少插入操作的锁竞争和索引维护的开销。 9. 定期维护数据库:定期进行数据库的维护工作,如统计表的统计信息、重建索引等,可以提高插入性能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值