[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;