现有四个表A,B,C,D  其结构如下
A表字段:单号 日期 厂商...等
B表字段:单号 单品编号 数量 单价 审核...等
C表字段:单号 日期 厂商 标志
D表字段:单号 单品编号 数量 单价 标志
说明:
1、A,B 两表有很多字段,因与我无关,所以不一一例出
2、B表是A表的附表,条件是单号相等,D表是C表的附表,条件也是单号相等
2、A,B两表仅能查询,C,D表是我用来分析计算
3、B表中数据海量,至少几百万条我想实现的功能是:
每天定时凌辰1点将A,B两表中数据复制到C,D表中,条件是复制C,D表中没有的“单号”即 where 单号 not in (select 单号 form C表)备注:
这几天一直在研究如何最优的实现上述功能,因为对oracle是初次接触,所以求救
我现在的想法是
第一步,定义一个过程,查出所有A表中在C表中没有的记录,然后用游标一条一条的按单号从B表中取出数据,放入D表,如果成功再把这条记录存入C表,直到所有A表中在C表中没有的记录全部存入C,D表中
第二步,定义一个作业JOB,每天凌辰1点执行请各位大侠支招

解决方案 »

  1.   

    没有必要用游标,只有两个操作:首先将满足条件的记录从B表中查询出再insert到D表
    然后将满足条件的记录从A表中查询出再insert到C表在两个SQL语句放在一个事务中即可。
      

  2.   

    用merge into 试试,
    merge into d using b
    on(b.id=d.id)
    when not matched then
    insert values(b.id,b......);
    效率大概会高一些
      

  3.   

    cursor,
    fetch bulk collect into .. limit 1000,
    forall
     insert
    oracle,merge into, google下会有详细的介绍
      

  4.   

    merge into的用法http://www.inthirties.com/thread-343-1-1.html
      

  5.   

    http://yangtingkun.itpub.net/post/468/26867
    http://www.blogjava.net/javaex/articles/248037.html
      

  6.   

    考虑到你首先要进行查询,然后在进行复制数据时,建议各表建索引,速度会快很多#1 method.
      

  7.   

    我觉得首先要评估一下每天数据变化量,即每天产生多少要向C,D表插入的数据。这个数据量是左右你使用什么复制方法的关键。其次,对数据变化量不是很大的,可以采用并行插入以加快速度,如
    INSERT /*+ APPEND */ 如果变化数据量大,也可采用定时expdp,impdp,掌控好导出所用时间。最后,匹配记录的时候,where 单号 not in (select 单号 form C表)  这个效率比较低,
    建议采用 select a.col1,a.col2 from a,c where a.单号=c.单号(+) and c.单号 is null ;
    相对效率高一些。