oracle数据库插入数据到表里有2种方法:
1.传统的插入方式:充分使用高水位下的空闲空间
create table bt AS select * from all_objects WHERE 1=0;
INSERT INTO bt SELECT * FROM all_objects;
2.直接路径(短路)插入方式:使用高水位上的空间
INSERT /*+ append */ INTO bt SELECT * FROM all_objects;
直接装载插入:
可正常(串行)或并行插入:并行插入到分区表时,每个分区只能有一个进程;并行插入非分区表时,每个进程分配一个临时segment,commit后由一个协调进程将data合并写入表segment;
可插入分区表、非分区表
可关闭logging
加上/*+ append */就是直接装载插入:
insert /*+ append */ into xxwz //append意为告诉oracle插入在高水位上的空间,blobk to block
nologging //不起作用,nologging无效,必须alter table hr.employees NOLOGGING;
select * from xxwz_old;
commit;
创建分区表
create table emp
(empno int,
ename varchar2(20)
)
partition by HASH(empno)
(partition part1,
partition part2
)
产生3个表,一个总表,2个子分区表,数据插入2个子分区表上,可2个进程并发插入。
开启并行插入
alter session enable parallel DML;
并行插入
insert /*+PARALLEL(hr.employees,2) */ //2个并发对应2个子分区表
into hr.employees NOLOGGING //nologging无效,必须alter table hr.employees NOLOGGING;
select * from hr.old_employees;
set autot on stat开启sql语句执行产生的统计信息
SQL*Loader插件
Bad file:不满足要求的数据错误信息放在这
Discard file:完全不满足基本的数据要求的放在这
Log file:不指定自动生成跟control文件名相同名字以..log结尾的日志文件
control file
datafile
1.把要打入的数据写在控制文件里
在demo1.ctl文件里编写
LOAD DATA
INFILE *
INTO TABLE DEPT
FIELDS TERMINATED BY ',' //数据以为逗号隔开
(DEPTNO,DNAME,LOC)
BEGINDATA
1,Sales,Hengyang
2,Accounting,Hengyang
3,Finance,Hengyang
在cmd打命令
sqlldr userid=u1/bbk control=demo1.ctl log=demo.log
2.把数据独立为data文件
在demo1.ctl文件里编写
LOAD DATA
INFILE demo.data
INTO TABLE DEPT
FIELDS TERMINATED BY ',' //数据以为逗号隔开
(DEPTNO,DNAME,LOC)
在demo.data文件里编写
1,Sales,Hengyang
2,Accounting,Hengyang
3,Finance,Hengyang
在cmd打命令
sqlldr userid=u1/bbk control=demo1.ctl log=demo.log
一般通过shell程序调用sqlloader脚本
判断数据导入状态:Exit Code退出码