/*+APPEND*/插入性能的示例分析
这篇文章给大家介绍/*+APPEND*/插入性能的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于成都网站制作、网站建设、桃江网络推广、重庆小程序开发公司、桃江网络营销、桃江企业策划、桃江品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联公司为所有大学生创业者提供桃江建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
使用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*/插入性能的示例分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
本文名称:/*+APPEND*/插入性能的示例分析
分享链接:http://myzitong.com/article/ipcohh.html