日期:2014-05-17  浏览次数:21291 次

如何提高批量insert效率
近日碰到一个批量insert 的问题,我有一个表
create table t1 (id int not null,
a varchar2(10) null,
b varchar2(10) null,
c varchar2(10) null,
d varchar2(10) null
) nologging;


我有一批类似下面的insert 语句

insert into t1(id,a) values(1,'a');
insert into t1(id,b) values(1,'b');
insert into t1(id,c) values(1,'c');
insert into t1(id,d) values(1,'d');



请问如何提高效率。
------解决方案--------------------
批量commit
------解决方案--------------------
数据量比较大的为什么不用sql loader导入
------解决方案--------------------
刚不久看到一个关于sql解析执行的内容。你可以试试
alter system set cursor_sharing = force

insert into t1(id,a) values(1,'a');
insert into t1(id,a) values(2,'a');
insert into t1(id,a) values(3,'a');
这些都只是一次解析,可能会快些。。


------解决方案--------------------
使用append参数才,减少redo生成量

INSERT /*+ APPEND NOLOGGING*/
    INTO t1(id,a)
SELECT 1,'a' FROM DUAL
UNION ALL
SELECT 1,'b' FROM DUAL
..
..
可以按2楼说的SQL LOADER
http://blog.csdn.net/fight_angel/article/details/10114699
------解决方案--------------------
1 不要轻易去修改oracle参数,如果你不了解的话。
2 可以使用 insert /*+append */ into t1......
------解决方案--------------------
BULK COLLECT + FORALL
------解决方案--------------------
10楼说的对,用 INSERT INTO t1(id,a,b,c,d)  SELECT ......非常方便