日期:2014-05-17  浏览次数:21177 次

left join inner join 等超级慢

A表
f_line f_produce  f_date      f_qty  --大概1W条
1005   KX-AAA-R1  2014-01-03   80
1004   KX-BBB-R1  2014-01-05   90
B表
f_line f_produce  f_date      f_qty  --大概1W条
1005   KX-AAA-R1  2014-01-03   80
1004   KX-CCC-R1  2014-01-05   90
A表和B表其他字段就不打出来了,主要需要数据的字段
--现在的sql
select a.f_linename,a.f_producemodel,left(a.f_date,7),sum(a.f_qty),b.f_linename,b.f_producemodel,left(b.f_date,7),sum(b.f_qty) from a
left join b on a.f_linename = b.f_linename and a.f_producemodel = b.f_producemodel 
and left(a.f_date,7) = left(b.f_date,7) where a.f_batch = 28 and b.f_batch = 28 
group by a.f_linename,a.f_producemodel,left(a.f_date,7),
b.f_linename,b.f_producemodel,left(b.f_date,7)

查询很慢 而且left join 的效果都没体现出来 因为A表和B表每个月的数据有很多重复的
要合计月份数据left join 找出A表存在的数据B表不存在的出来看 请问怎么查询才快

------解决方案--------------------
现有的执行计划贴出来看看,ctrl+M,然后运行你的查询,
------解决方案--------------------
引用:

A表
f_line f_produce  f_date      f_qty  --大概1W条
1005   KX-AAA-R1  2014-01-03   80
1004   KX-BBB-R1  2014-01-05   90
B表
f_line f_produce  f_date      f_qty  --大概1W条
1005   KX-AAA-R1  2014-01-03   80
1004   KX-CCC-R1  2014-01-05   90
A表和B表其他字段就不打出来了,主要需要数据的字段
--现在的sql
select a.f_linename,a.f_producemodel,left(a.f_date,7),sum(a.f_qty),b.f_linename,b.f_producemodel,left(b.f_date,7),sum(b.f_qty) from a
left join b on a.f_linename = b.f_linename and a.f_producemodel = b.f_producemodel 
and left(a.f_date,7) = left(b.f_date,7) where a.f_batch = 28 and b.f_batch = 28 
group by a.f_linename,a.f_producemodel,left(a.f_date,7),
b.f_linename,b.f_producemodel,left(b.f_date,7)

查询很慢 而且left join 的效果都没体现出来 因为A表和B表每个月的数据有很多重复的
要合计月份数据left join 找出A表存在的数据B表不存在的出来看 请问怎么查询才快


改成这样试试:
select a.f_linename,a.f_producemodel,left(a.f_date,7),
sum(a.f_qty),b.f_linename,b.f_producemodel,left(b.f_date,7),sum(b.f_qty) 
from a
left hash join b on a.f_linename = b.f_linename and a.f_producemodel = b.f_producemodel 
                 and left(a.f_date,7) = left(b.f_date,7) where a.f_batch = 28 and b.f_batch = 28 
group by a.f_linename,a.f_producemodel,left(a.f_date,7),
b.f_linename,b.f_producemodel,left(b.f_date,7)