Oracle Direct-Path Insert学习笔记


http://www.blogjava.net/fjpan2002/archive/2006/11/14/81051.aspx



(1)、Oracle插入数据有两种方式:



a、常规插入:重新使用table中的自由空间,在已有数据中插入新数据;维护引用完整性约束。



b、Direct-Path插入:在表中已有数据之后插入新数据;数据直接插入数据文件,绕过buffer cache;已有数据中的自由空间没有被重新利用;忽略了引用完整性约束。



 



(2)、连续模式:一个进程执行sql语句;



       并行模式:多个进程同时执行一个sql语句,即并行执行。



 



(3)Direct-Path插入的优点:



1、可以disable redo log和undo log;而常规插入却不可以如此,并且重用自由空间和维护引用完整性。



2、通过CREATE TABLE...AS SELECT 语句可以从现有表中创建新表,使用Direct-Path插入可以在插入时更新定义在目标表上的任意索引。



3、Direct-Path插入能保证事务的原子性,即使在并行模式下。使用SQL*Loader在并行模式加载中不能保证原子性。



4、当并行Direct-Path加载发生错误时,索引被标志成UNUSABLE。



5、如果想使用表压缩的压缩格式存储数据,必须使用Direct-Path插入。



 



 



(4)使用Direct-Path插入:



 



在连续模式中,在Insert语句中指定“APPEND”提示,在INSERT关键字之后,或者在INSERT子查询中的SELECT关键字之后。



在并行DML模式中,默认的就是DIRECT-PATH插入,为了运行并行DML模式,必须满足以下条件:



a、必须是Oracle企业版;



b、必须在session中使并行DML生效,执行以下sql语句:



ALTER SESSION { ENABLE | FORCE } PARALLEL DML;



c、必须指定table的并行属性,在创建的时候或者其他时候,或者在insert操作时使用“PARALLEL”提示。



 



为了使Direct-Path Insert模式失效,在INSERT语句中指定“NOAPPEND”提示,覆盖并行DML模式。



 



(5)、Direct-Path INSERT 是如何工作的



 



在分区表和非分区表都可以使用Direct-Path INSERT



 



连续Direct-Path INSERT到分区和非分区表



  单个进程插入数据到高水位标志之上,当执行完commit之后,高水位标志得到更新。



 



并行Direct-Path INSERT到分区表



  类似于serial Direct-Path INSERT,每个并行操作分配给一个或者多个分区,每个并行操作插入数据到各自的分区段的高水位标志之上,commit之后,用户就能看到更新的数据。



 



并行Direct-Path INSERT到非分区表



  每个并行执行分配一个新的临时段,并插入数据到临时段。当commit运行后,并行执行协调者合并新的临时段到主表段,用户就能看到更新的数据。



 



为Direct-Path INSERT指定的Log模式



   Direct-Path INSERT可以使用Log或者不使用Log。



 



(6)、其他需要注意的地方:



    索引维护:Oracle在Direct-Path INSERT 操作末尾,对具有索引的表执行索引维护,这样就避免了在drop掉索引后,再rebuild。



    使用的空间:Direct-Path INSERT比常规的插入需要更多的空间。因为它将数据插入在高水位之上。并行插入非分区表需要更多的空间,因为它需要为每一个并行创建临时段。



    锁:在插入期间,数据库在表上获得排他锁,用户不能在表上执行并行插入、更新或者删除操作,并行的索引创建和build也不被允许。但却可以并行查询,但查询返回的是插入之前的结果集。