目的是将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、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万级数据量与千万级数据量,或者有更好的方法,请教!
曾经有过经历,先插入中间表,建立索引,再join,因为两个表的数据量都是上千万的
速度还是达不到要求。后来改成每100万记录处理一次,速度加快不少
现在一直用这个办法
对ta索引col1,col2
对tb索引col3,col4
sum(col2),max(col4)分别用数组处理显然更快方法2:
对col1,col3创建聚簇索引,直接作join查询
回2楼,因为ta,tb查询条件不同,无法先join后查询
另外,能否说明我写的第一种方法对于大数据量,oracle是怎么实现的?
中,再进行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);