现在有表:A、B、C、D、E五张,其所有字段都为varchar2类型。
   表A字段:a1,a2,a3,a4 ; 表B字段:b1,b2,b3,b4 ;
   表C字段:c1,c2,c3,c4 ; 表D字段:d1,d2,d3,d4 ;
   表E字段:e1,e2,e3,e4 ;
    
   存储过程执行第一步,先进行5张表的联合查询:
   表A通过a1=b1 and a2=b2和表B进行内连接,并且a3='3' and b3='3',结果记作RESULT_A;
   表C通过c1=RESULT_A.a1 and c2=RESULT_A.b2和RESULT_A进行内连接,并且c4='4',结果记作RESULT_B;
   表D通过d1=RESULT_B.b1 and d3=RESULT_B.b3和RESULT_B进行内连接,并且d4='4' and RESULT_B.c3='3'结果记作RESULT_C;
   表E通过e1=RESULT_C.d1 and e2=RESULT_C.a4和RESULT_C进行内连接,并且e3='3'。结果记作RESULT_D
   
   存储过程执行第二步,将上查询结果RESULT_D插入到新建表F中(表F结构省略)
 
  由于5张表中的数据很大(至少50w),目前的想法:能否将上面两张表A、B的查询结果先存到临时表中,再让临时表和第三张表C查询,查询的结果再放到临时表中和第四张表D关联查询.....依次执行,最终结果存放到表F中。
   
   各位还有没别的更好的优化方式??

解决方案 »

  1.   

    insert into f as
    select [fields]
    from a 
    join b on a.a1=b.b1 and a.a2=b.b2
    join c on c.c1=a.a1 and c.c2=b.b2
    join d on d.d1=b.b1 and d.d3=b.b3
    join e on e.e1=d.d1 and e.e2=a.a4
    where a.a3='3' and b.b3='3' and c.c4='4' and d.d4='4' and e.e3='3';
      

  2.   


    +1如果只是50W左右的数据,你不用太过担心性能问题,除非是你的服务器特别差,现在一般的PC做服务器都能承担起这样的查询,并且效率不会太差;PS:相应的索引要建起来。
      

  3.   

    insert into select就可以了要谈性能问题的,主要是select的性能,和insert into时的性能了
    select的性能,看执行计划了。
    insert into的性能,disable index/append/nolog
    考虑到会滚段的压力,批量提交。
      

  4.   

    我用4张表进行inner join 貌似效率很低。报错:
    ORA-O1652:无法通过128(在表空间TEMP中)扩展temp段
    ORA-27059:无法减小文件大小
    OSD-04005:SetFilePointer()失败,无法读取文件
    O/S-Error:(OS 112)磁盘空间不足。看来只能用临时表一试了