ITPub博客

首页 > Linux操作系统 > Linux操作系统 > /*+APPEND*/插入性能总结

/*+APPEND*/插入性能总结

Linux操作系统 作者:zr2095 时间:2016-11-29 10:43:40 0 删除 编辑
 

使用append提示进行insert叫做直接路径加载插入。

【特点】

1使用这种提示因为系统不去查找freelist链表中的空闲块,直接在高水标记位以上插入数据,因此速度比较快。但若是对于经常delete的表,浪费磁盘空间太大!

2它不记录日志,因此一旦插入的数据在没有保存回磁盘的时候发生掉电之类的状况插入的数据不能重做。

3/*+append*/后,需要马上提交,否则会影响下一次修改失败(insert,update,delete)

在Oracle Database 10g Enterprise Edition Release 10.2.0.1.0中,如果插入操作的语法是

insert /*+append*/ into XXX values(XXX);

那么系统加的是row exclusive锁,也就是正常insert所加的行级锁,但是如果插入操作的语法是

insert /*+append*/ into XXX select XXX from XXX;

那么系统加的是exclusive锁,相当于表级锁,加表级锁意味着在本会话没有commit的时候其他任何会话都不能再进行insert,update,delete操作

 

【相关SQL语句】

检查数据库归档模式(NOARCHIVELOGARCHIVELOG):

Archive log list

或者

SELECT log_mode from v$database;

查看当前redo日志大小:

select name,value,class from v$sysstat where name='redo size';

或者打开统计,这个更准确地统计当前语句生成的redo,推荐使用

set autotrace traceonly statistics

 

普通插入方式:

insert into t select * from dba_objects;

append插入方式:

insert /*+append*/ into t select * from dba_objects;

Append+nologing插入方式:

insert /*+append*/ into t nologging select * from dba_objects;

 

【测试结论】

1、无论归档模式、还是非归档模式,append+nologing插入方式效果最好,生成最小的redo日志

2、非归档模式下,append插入模式效果不错

3、归档模式下,append插入模式没有效果

 

【测试例子】

http://wenku.baidu.com/view/2cd6472a4b73f242336c5fa8.html

 

【我的测试】

从以下对比可以看出,增加hint方法,速度增加4 

 

 还真的有这么神,都是180万行的表拷贝,我的测试如下:

insert into p_nbsc_ho1 select * from p_nbsc_ho (消耗时间73分钟)

insert /*+append*/ into p_nbsc_ho2 select * from p_nbsc_ho (消耗时间7分钟)

 

弊端:

insert /*+append*/ 如果不commit的话,会对该表加6级锁,也就是说,即使此时select 这个表都会报错。

因此append提示的语句首先不能是业务表,其次要尽快提交commit,所以一般情况不敢用hint了。

 

 

 

 

 

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

上一篇: ?ORACLE会话超时
请登录后发表评论 登录
全部评论

注册时间:2015-04-15

  • 博文量
    163
  • 访问量
    421347