关于使用insert append和parallel

为避免将来的理解冲突,本文所有说明基于Oracle 10g版本。

 

关于使用insert append

Eygle大师曾经对insert appendlogging/nologging的关系做过比较全面的测试和说明(http://www.itpub.net/thread-242761-1-1.html)。

这里不详述了,只给出结论:

 

非归档模式下,不管表是否设置logging/nologgingappend都会减少redoundo的生成。

归档模式下,append+nologging才能减少redoundo的生成。

 

注意在direct insert 下,实际上操作是不会对数据产生redoundo的,但这不代表不会产生redoundo

 

另外在direct insert后,由于插入的数据没有在redo中记录,此时如果需要进行恢复,插入的记录数据会丢失。所以在插入数据后,需要进行全库数据备份。

 

append方式插入记录后,要执行commit,才能对表进行查询。否则会出现错误:

ORA-12838: 无法在并行模式下修改之后读/修改对象

 

另外insert append时在表上加“6”类型的锁,会阻塞表上的所有DML语句。因此在有业务运行的情况下要慎重使用。若同时执行多个insert append对同一个表并行加载数据,并不一定会提高速度。

 

使用append insert方法:

alter table t nologging;

insert /*+ append */ into test.t select * from test.t2;

commit;

 

关于使用parallel

可以在表级设置并行度,比如:

create table test nologging PARALLEL (DEGREE 7) as select * from dba_tables;

alter table t parallel (degree 4);

 

也可以通过SQL hint在会话级别设置,但是需要注意,如果想在执行DML语句时使用并行(比如insertdeleteupdate),需要enable parallel dml,比如:

alter session enable parallel dml;

insert /*+ append parallel(t 4) */ into t select * from t2;

 

顺便给出我以前的2个测试结论:

实验1insert时间比较

insert into t select * from t2; (耗时00:00:12.96

普通insert

 

alter table t nologging;

insert /*+ append */ into t select * from t2;  (耗时00:00:00.74

direct insert,时间最短效率最好。

 

alter session enable parallel dml;

insert /*+ append parallel(t 4) */ into t select * from t2; (耗时00:00:02.07

direct insert +parallel,其实并没有direct insert效率高,不过比普通insert好点。

 

实验2create table + parallel产生UNDO测试

方法1

create table test as select * from dba_tables;

 

方法2

create table test nologging as select * from dba_tables;

 

方法3

create table test nologging PARALLEL (DEGREE 7) as select * from dba_tables;

 

方法4

create table test as select * from dba_tables where 1=0;

insert into test select * from dba_tables;

commit;

 

监控方式:

SQL> select sid,username from v$session;

SQL> select * from v$sesstat where sid=(select sid  from v$session where username='TEST') and STATISTIC#=(select STATISTIC# from v$statname where name='undo change vector size');

 

所有测试执行三次,结果如下:

 

 

1undo产生量(单位:bytes)

2

3

方法1(create table as select)

29212

30380

36220

方法2(nologging)

28684

26956

28640

方法3(nologging parallel)

90120

89312

91260

方法4(create table and insert data)

40660

43796

41940

 

结论:创建表时增加并行度会产生较多的undo量。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20750200/viewspace-720885/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20750200/viewspace-720885/

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值