这篇文章给大家介绍/*+APPEND*/插入性能的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
使用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操作
检查数据库归档模式(NOARCHIVELOG、ARCHIVELOG):
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插入模式没有效果
【我的测试】
从以下对比可以看出,增加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了。
关于/*+APPEND*/插入性能的示例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/199952.html