目的是将2张表按不同条件筛选记录,并按照主键join,请问以下2种sql语句效率如何?
1、select a.col1,a.sumcol2,b.maxcol4
   (
   select col1 sum(col2) sumcol2
   from ta
   group by col1
   ) a,
   (
   select col3 max(col4) maxcol4
   from tb
   group by  col3 
   ) b
   where a.col1 = b.col3;
2、将2个查询插入临时表,然后建索引再join?
10万级数据量与千万级数据量,或者有更好的方法,请教!

解决方案 »

  1.   

    大数据量需要分布处理,上千万级以上的数据更是如此。
    曾经有过经历,先插入中间表,建立索引,再join,因为两个表的数据量都是上千万的
    速度还是达不到要求。后来改成每100万记录处理一次,速度加快不少
    现在一直用这个办法
      

  2.   

    方法1:
    对ta索引col1,col2
    对tb索引col3,col4
    sum(col2),max(col4)分别用数组处理显然更快方法2:
    对col1,col3创建聚簇索引,直接作join查询
      

  3.   

    回1楼,请问怎么改成每100万记录处理一次?请详细说明,小弟是初学者,谢谢!
    回2楼,因为ta,tb查询条件不同,无法先join后查询
    另外,能否说明我写的第一种方法对于大数据量,oracle是怎么实现的?
      

  4.   

    第一种写法:oracle先检索出一个结果集放在虚拟表a中,再检索第二个结果集放在虚拟表b
    中,再进行join,这样做的结果是两个虚拟表都没索引,检索速度不佳。
    第二种做法则是在表中添加标志列,已经处理的标为1,未处理标为0
    如: create table tab_tmp1 as select * from tab_a where flag=0 and rownum<1000000;
    create index ix_tab_tmp1_nid on tab_tmp1(nid);