BULK COLLECT + FORALL 处理oracle 大数据读写,急速DBlink数据查询

2014-11-13 10:39:23     16 人阅读    

工作中遇到如下问题:

1、现场数据库环境  2个oracle .
    OarcleDB A 和 OracleDB B,
    其中A为生产库,存放用户信息,供应用程序直接链接查询
           B为资源库,存放大量的用户订单信息,数据量非常大,上亿

           A 通过 dblink链接到 B


2、现在有一个需求,是在数据库A 统计用户的历史订单数据,并进行计算, 而被统计的订单数据,基本上都在数据库B上面


  1、统计的基本思路如下,先把需要统计用户的信息从B数据库中加载到A数据库中的 表中然后再对表进行数据处理。。


3、现在问题出现在加载数据到A 表的过程中, 由于B的数据量太大,加载过程十分缓慢,动不动就卡死,或者1~2个小时的时间...
     并且不敢如何优化字段和索引,都没有太大的效果..


     这个时候发现了
      BULK COLLECT  + FORALL  ,处理这种情况的数据非常的块,直接从1~2个小时,编程1~2分钟..效率杠杠的...


下面是具体的存储过程代码:


 

 BULK COLLECT  + FORALL 处理oracle 大数据读写

在oracle大数据量的读写操作时,使用  BULK COLLECT  + FORALL  会优化和提速。特别是在dblink环境下,能把效率发货的淋漓尽致...

create or replace procedure TestForAll_bulkConnection is

   TYPE test_table IS TABLE OF SP_RECHARGE_DETAILS_C%ROWTYPE;
   test_table_ins test_table;
BEGIN
    SELECT /*+ driving_site(SP_RECHARGE_DETAILS) */ /*+ driving_site(SP_NODE_INFOR) */ SEQ_SP_RECHARGE_DETAILS_H.NEXTVAL,S.VOUCH,S.NODENO,S.OPETIME,S.TRACODE,S.CARDNO,S.CUSTOMID,S.AMOUNT,S.Advpaytype,S.DEAL_STATE,S.DATA_DATE,S.SEQUENCE,T.USER_ID,S.RVOUCH   BULK COLLECT INTO test_table_ins
     FROM ( SELECT S_T.*
            FROM SP_RECHARGE_DETAILS S_T
            WHERE (S_T.DEAL_STATE IS NULL OR S_T.DEAL_STATE= 'N')
            AND ( S_T.TRACODE='19' OR S_T.TRACODE='01' OR S_T.TRACODE='0A' OR S_T.TRACODE='02') /*and rownum <5000000*/ ) S
     INNER JOIN SIN_USER T ON S.CARDNO = T.OIL_CARD_NO AND T.STATE= 904002
     INNER JOIN SP_NODE_INFOR I ON I.NODENO=S.NODENO
     WHERE S.OPETIME>= T.REGISTER_DATE;

    FORALL idx IN test_table_ins.first..test_table_ins.last
           INSERT INTO SP_RECHARGE_DETAILS_C VALUES test_table_ins(idx);
    COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
END;


原文地址:http://www.itmmd.com/201411/169.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

java痛苦的面试官 !SSH害了一代人? java程序员-难道你只懂SSH吗?   上一篇
下一篇  windows java环境变量设置

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!