直接路径插入
直接路径插入(Direct Path Insert)提供了高效率插入数据的方式。“直接路径”的意思就是绕过Data buffer cache,将数据直接插入数据文件,而且插入的数据都位于表的高水位线以上。
SQL语句直接路径插入的几个要点:
1、Direct Path Insert只适用于从一个已有的表往另一个表中插入数据,通过在insert语句中指定/*+APPEND*/实现:
Insert /*+APPEND */ into tableA select ... from tableB;
2、Direct Path Insert可以指定NOLOGGING模式,只写入非常少量的REDO LOG,进一步提升效率(但会对恢复带来不便,只有在归档模式下才产生显著作用?)。NOLOGGING选项不只适用于Direct Path Insert,也适用于重建索引等操作;
3、如果一个表中之前删除过大量数据后执行Direct Path Insert,会带来空间的浪费;
4、以append方式插入记录后,要执行commit,才能对表进行查询;
5、不管表是否在nologging 下,只要是direct insert,就不会对数据内容生成undo;
6、在机器有多个CPU的情况下,可以使用并发Direct Path Insert:
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+PARALLEL(scott.emp,2) */
INTO scott.emp NOLOGGING
SELECT * FROM scott.old_emp;
并行直接路径插入也适用于CTAS方式:
create table t1 nologging parallel(degree 2) as select * from t;
SQLLoader直接路径插入
类似于SQL语句,使用SQLLoader也有两种插入方式:传统和直接路径插入(conventional & Direct Path)。直接路径插入的限制是:不能对所有约束校验,不触发trigger,其他会话无法并行修改表数据。
类似于SQL语句,通过使用多个数据源文件,SQLLoader也可以实现并行插入。
SQLLoader的几个文件:数据文件、控制文件、日志文件、非法数据文件(bad file)、抛弃数据文件(discard file,如果需要有选择的插入数据)
这篇文章对高效插入数据有较全面的论述:
http://www.examda.com/oracle/zhonghe/20100405/092807472-3.html