关于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。
本文讨论了Oracle中使用insert/*+append*/进行直接路径加载的特点,包括如何减少redo日志生成、对表锁定的影响以及在不同模式下的性能表现。
1997

被折叠的 条评论
为什么被折叠?



