Insert /*+append*/的作用
在使用了append选项以后,insert数据会直接加到表的最后面,而不会在表的空闲块中插入数据。
使用append会增加数据插入的速度。
/*+APPEND*/的作用是在表的高水位上分配空间,不再使用表的extent中的空余空间
append 属于direct insert,归档模式下append+table nologging会大量减少日志,非归档模式append会大量减少日志,append方式插入只会产生很少的undo
不去寻找 freelist 中的free block , 直接在table HWM 上面加入数据。
关于Nologging与append测试的一些总结,通过上面的SQL语句查看可以得出在大量数据插入过程的语句中加入/*+append*/的这个SQL语句产生的REDO日志明显示是会少同时时间节约了很多,当然这样可能会影响备份因此nologging加载数据后要做一个数据库的全备。
insert append并不是在任何时候都可以节省时间的以下是测试的一些总结:
第一种情况:
database为archivelog状态,这种情况下,就算你用insert append也是不一定提高插入效率的。但是如果你将目标表设置为nologging,然后再使用insert append就会很快。
第二种情况:
database为noarchivelog状态,如果在这种情况下直接采用insert方法而不加入append向表中插入数据,占用的redo空间的大小与archivelog状态下占用的大小是相当的,不论表是否为nologging。但是如果采用insert append方法的话,通过redo的占用值大家可以发现,不论表是否为nologging,所占用的redo的大小都是很小的。也就说明:在数据库为noarchivelog的状态下,采用insert append方法,如果表不是nologging,系统也会自动将表转换为nologging(即在执行insert append之前,先执行一个alter table arch1 nologging)。
第三种情况:
如果表上有索引,则append方式批量添加记录,不会减少索引上产生的redo数量,索引上的redo数量可能比表的redo数量还要大。用insert append可以实现直接路径加载速度是快很多,但有一点需要注意: insert append时在表上加”6”类型的锁,会阻塞表上的所有DML语句,因此在有业务运行的情况下要慎重使用。若同时执行多个insert append对同一个表并行加载数据,并不一定会提高速度,因为每一时刻只能有一个进程在加载(排它锁造成)。对于ORACLE数据库来说只要DML特别是insert操作他肯定会将表给锁住而且是独占锁除非进行commit,rollback,及其它的DDL操作来释放否则锁会一直独占导致其它的DML操作无法进行正常的操作,而跟所谓的APPEND无关。
以下是关于表模式(LOGGING/NOLOGGING),插入模式(APPEND/NOAPPEND),数据库运行模式(归档/非归档),REDO日志产生的关系
数据库模式 表模式 插入模式 Redo日志的产生
| Archivelog | Logging | Append | 有redo |
| Archivelog | Logging | No append | 有redo |
| Archivelog | Nologging | append | 无redo |
| Archivelog | Nologging | No append | 有redo |
| Noarchivelog | Logging | append | 无redo |
| Noarchivelog | Logging | No append | 有redo |
| Noarchivelog | Nologging | append | 无redo |
| Noarchivelog | Nologging | No append | 有redo |




