[Oracle Notes]Oracle Direct-Path Parallel and Serial Inserts直接路径加载在数据仓库的应用

最近在做一个Data warehousing的项目,里面遇到很多大数据量表loading insert, 处理起来非常的耗时间,性能可想而知,而且用的还是DBLink去拿数据;

Platform: Windows 2008R2 ENT 64bit

oracle version: 10.2.0.4-64bit

先清空这个table,然后进行INSERT的处理, 其中的DBLink取数据的方式是建了一个View ;

  create view vw_rds_org as select "ORG_ID","NAME","LONG_NAME","LONG_DESC","STTUS_CODE","DELET_DATE" from ORG@rds.oracle.com

   EXECUTE IMMEDIATE 'TRUNCATE TABLE PDT_ORG';

    INSERT INTO PDT_ORG
               (org_id
               ,name
               ,long_name
               ,long_desc
               ,sttus_code
               ,delet_date)
         SELECT a.org_id
               ,a.name
               ,a.long_name
               ,a.long_desc
               ,a.sttus_code
               ,a.delet_date
           FROM vw_rds_org a;


为此想到了直接路径加载的方式,希望通过它来达到优化的性能,提高insert的效率 。通过/*+ append*/的使用,性能效果提升明显

Tips:

直接路径加载表示绕过buffer cache,直接将数据写入表中。直接路径加载不会将数据写入HWM以下的数据块,而是在HWM之后写入数据,由于绕过了buffer cache,所以直接路径加载的时候性能好于常规路径加载。

直接路径加载可以并行运行(parallel),也可以串行运行(serial),既可以对分区表做直接路径加载,也可以对非分区表做直接路径加载。指定 APPEND hint就表示启用了直 接路径加载特征。在11G之前,直接路径加载只支持insert ...select,从11G 开始,Oracle支持 insert .... values()启用直接路径加载特征,我们只需要在 insert之后 跟上 /*+ append_values */

就可以启用直接路径加载。典型应用就是PL/SQL程序中使用了FORALL loop。

下面就是一个 insert .... values 示例(摘自Oracle11gR2 Administrator's Guide) 

FORALL i IN 1..numrecords

                        INSERT /*+ APPEND_VALUES */ INTO orderdata 

        VALUES(ordernum(i), custid(i), orderdate(i), shipmode(i), paymentid(i));

COMMIT;

 

posted @ 2012-08-19 14:06  jefflu99  阅读(208)  评论(0编辑  收藏  举报