[ORACLE]使用/*+append*/直接路径加载插入需要注意的三点

使用append提示进行insert叫做直接路径加载插入,使用这种提示因为系统不去查找freelist链表中的空闲块,直接在高水标记位以上插入数据,因此速度比较快。但是也应该注意直接路径加载插入有一些不同:
1.它不记录日志,因此一旦插入的数据在没有保存回磁盘的时候发生掉电之类的状况插入的数据不能重做。
2.它比较浪费磁盘空间,有心的同学可以做个简单的实验,创建个空表,用insert 插一些数据,然后delete掉,然后再用insert 插一些数据,再delete掉,这样反复操作,最终用delete把表清空,然后用下面的语句查一下表的大小,可以看到一个空表占了可怕的磁盘空间!
Select round(Sum(bytes)/1024,2)||‘KB’ as sizes
From dba_extents
where segment_name='表名'
Group By owner,segment_name,segment_type;
3.它在不同的Oracle版本中所加的锁是不一样的,我在两个版本中做了实验。
在Oracle Database 10g Enterprise Edition Release 10.2.0.1.0中,如果插入操作的语法是
insert into XXX values(XXX);
那么系统加的是row exclusive锁,也就是正常insert所加的行级锁,但是如果插入操作的语法是
insert into XXX select XXX from XXX;
那么系统加的是exclusive锁,相当于表级锁,加表级锁意味着在本会话没有commit的时候其他任何会话都不能再进行 insert,update,delete操作。不过这里看起来更严重,就连自己的会话也不能再进行任何insert,update,delete操作, 否则就会提示:
ETL@RACTEST> insert into ljntest select a from ljntest2;

1 row created.

Elapsed: 00:00:00.01
ETL@RACTEST> insert into ljntest select a from ljntest2;
insert into ljntest select a from ljntest2
*
ERROR at line 1:
ORA-12838: cannot read/modify an object after modifying it in parallel
在Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 中就简单一些了,不管是哪种语法,一概加的是exclusive锁!
所以大家在使用直接路径加载插入时或是测试开发的代码时一定要注意这三点。

posted @ 2012-08-19 23:47  jefflu99  阅读(2251)  评论(0编辑  收藏  举报