加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

向表中快速插入记录的方法 Oracle

(2017-10-23 17:02:25)
标签:

快速添加数据到表中

快速添加记录oracle

快速添加记录的方法

insert插入数据的方法

分类: Oracle数据库
       在日常的数据处理中,我们经常会遇到向某一个表中添加数据的情况,如果添加的数据量比较大,此时速度会比较慢,那如何优化提升数据插入速度呢?下面我们来看下常用的方法吧。

一、使用merge快速插入
merge into t1 a
using(select * from t2 where ...) b
on(a.account_id=b.account_id)
when matched then
  update set a.col1=b.col1,...
when not matched then
  insert values(b.col1,b.col2...)
;
commit;

二、向表中插入2条记录
insert all
into t1 values(1)
into t1 values(2)
select * from dual;
commit;

三、插入数据时不记录日志
insert的时候可通过append选项不产生归档日志。
3.1、通过nologging选项不产生日志
--先将t1表修改为不写日志
alter table t1 nologgin;
--插入数据
insert into t1
select * from t2
;
commit;
--恢复t1表写日志操作
alter t1 logging;
说明:如果插入数据的同时又写日志,尤其是大数据量的insert操作,需要耗费较长的时间

3.2、在insert时添加nologging参数
insert into t1 nologging
select * from t2;
commit;

3.3、再添加指定列时,添加nologging和parallel参数
insert into t1 nologging(col1,col2)
select col1,col2 from t2;
commit;

--开启并行度
insert into t1 nologging(col1,col2)
select col1,col2 from t2;
commit;

四、采用批量拷贝
set arraysiea 20;
set copycommit 5000;
copy from username/password@sid append t1
using select * from t2;

五、采用创建表重命名
--创建临时表
drop table t1_bak;
create table t1_bak
as
select * from t2
--删除表
drop table t1;
--重命名表为t1
rename t1_bak to t1;

六、用exp/imp 处理大量数据
1.给当前的两个表分别改名
alter table t1 rename to t11;
alter table t2 rename to t1;
2.导出改名前的t2
exp user/pwd@... file=... log=... tables=(t1);
3.把名字改回来
alter table t1 rename to t2;
alter table t11 rename to t1;
4.导入数据
imp user/pwd@... file=... log=... fromuser=user touser=user tables=(t1);

七、归档模式和非归档模式下的测试对比
非归档模式下:
没有优化前(1281372  redo size)
1.单一的使用nologging参数,对redo的产生没有什么影响。(1214836  redo size)
2.单一的使用append提示,redo的减少很显著(43872  redo size)
3.nologging+append,更显著(1108  redo size)

归档模式下:
没有优化前(1281372  redo size)            
1.单独使用nologging参数,(1231904  redo size)
2.单独使用append提示,(1245804  redo size)
3.nologging + append,(3748  redo size)

选项说明
a.使用nologging参数并不代表在dml操作中,oracle不产生redo,只是对于指定表的更新数据不产生redo,但是oracle还是要记录这些操作,所以无论怎么优化,dml操作肯定要产生redo,但是使用这些参数对redo size的影响还是非常可观的。
b.单独使用nologging参数,对redo size没有多少影响,只有和append配合使用时,才能产生效果。
c.单独使用append提示,对redo的产生影响很大,这是我到现在都不明白的道理,按说append是绕过freelists,直接去寻找新块,能减少对freelists的争用,为什么会少这么多redo呢?
d.归档模式和非归档模式下,参数影响不一样,尤其是单独使用append参数时,看来oracle对归档模式下出于安全考虑还是要多一些。

八、oracle中append的作用
示例:insert into table1 select * from table2
在使用了append选项以后,insert数据会直接加到表的最后面,而不会在表的空闲块中插入数据,使用append会增加数据插入的速度。
的作用是在表的高水位上分配空间,不再使用表的extent中的空余空间。
append 属于direct insert,归档模式下append+table nologging会大量减少日志,非归档模式append会大量减少日志,append方式插入只会产生很少的undo,不去寻找 freelist 中的free block ,直接在table HWM 上面加入数据。




本文参考资料:
http://www.cnblogs.com/Csharpblogs/articles/2126636.html

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有