关于insert /*+ append */我们需要注意以下三点:
a、非归档模式下,只需append就能大量减少redo的产生;归档模式下,只有append+nologging才能大量减少redo。
b、insert /*+ append */ 时会对表加锁(排它锁),会阻塞表上的除了select以外所有DML语句;传统的DML在TM enqueue上使用模式3(row exclusive),其允许其他DML在相同的模式上获得TM enqueue。但是直接路径加载在TM enqueue使用模式6(exclusive),这使其他DML在直接路径加载期间将被阻塞。
c、insert /*+ append */ 直接路径加载,速度比常规加载方式快。因为是从HWM的位置开始插入,也许会造成空间浪费。
SQL>
create
table
test1 nologging
as
select
*
from
dba_objects
where
1=0;
在归档模式下,对于常规表的insert append产生和insert同样的redo,此时的insert append实际上并不会有性能提高,
但是此时的append是生效了的。
在非归档模式下表设置为nologging用insert /*+append*/速度最快。那为什么快呢,原理是什么?
结论:两次对比的结果表示用insert /*+append*/后,数据的undo和redo没有生成。因为HWM (高水位线)在移动的过程中,这些block是不能被其他process使用的,
那么意味着,只要记录下该次direct insert所涉及到的空间的redo 和 undo ,在失败回滚的时候,只需要把这些空间修改为原来的状态就可以,而不用逐个记录去delete。