表示需求很简单,可这数据量一大我就hold不住了。
解决方案 »
- 【满分】hadoop求解
- 在struts2中如何向action传送Map<String, Object> , 其中object不是一个固定的对象
- 整合hibernate3.3和spring3.0出现问题,望高手解答
- 大家来帮我看一个问题,奇了怪了!!!!
- 监听电脑键盘按下哪个键,最好是java的
- 在数据库中的.读出来的时候是?怎么解决
- 同一时间只有一个人操作
- 问个常识问题:服务器的JSP容器也是TOMCAT6.0服务器吗?我本机是jsp+tomcat。
- (求助)Struts的ApplicationResources文件的解析.
- Hibernate的数据库存取及中文问题!
- 数组转换MAP报错
- poi word设置行高
没弄清楚需求吧。
没弄清楚需求吧。我怕大家搞混才这样写的,其实是这样的,t5其实就是t4,countAA是group by字段t1、t2、t3、t4,条件为t4是success、wait值
from (select count(1) a, t1, t2, t3, t4 from A group by t1, t2, t3, t4) a
left join (select count(1) aa, t1, t2, t3, t4
from A where t4 = 'success' group by t1, t2, t3, t4) aa
on a.t1 = aa.t1
and a.t2 = aa.t2
and a.t3 = aa.t3
and a.t4 = aa.t4
left join (select count(1) b, t1, t2, t3, t4
from B group by t1, t2, t3, t4) b
on b.t1 = aa.t1
and b.t2 = aa.t2
and b.t3 = aa.t3
and b.t4 = aa.t4
比如
A表字段
t1,t2,t3,t4
B表字段
t1,t2,t3,t4期望的结果是怎样?
from (select count(1) a, t1, t2, t3, t4 from A group by t1, t2, t3, t4) a
left join (select count(1) aa, t1, t2, t3, t4
from A where t4 = 'success' group by t1, t2, t3, t4) aa
on a.t1 = aa.t1
and a.t2 = aa.t2
and a.t3 = aa.t3
and a.t4 = aa.t4
left join (select count(1) b, t1, t2, t3, t4
from B group by t1, t2, t3, t4) b
on b.t1 = aa.t1
and b.t2 = aa.t2
and b.t3 = aa.t3
and b.t4 = aa.t4
就是7楼这个想法,但这样查询太慢了。
这个数据这么多在内存里计算不好,直接用sql搞定得了。才150W数据耗时不会太高的,可以优化。
这个数据这么多在内存里计算不好,直接用sql搞定得了。才150W数据耗时不会太高的,可以优化。sql和你在7楼写的基本一致。唯一不同的是,A表其实是2张表通过UNION连接起来的,B表也是2张表通过UNION连接起来。
单张表查询执行结果保守估计十万条左右。
如:select *
from (select *
from (select * from a) a
left join (select * from b) b
on a.a = b.b) c
where c.c = 1先试
select * from a
再试
select * from b
再试
select *
from (select * from a) a
left join (select * from b) b
on a.a = b.b
到哪一步突然慢特别慢,这里就是效率瓶颈,想办法优化。在经验不丰富的时候,可以使用这个简单方法能查出来大部分问题。
首先数据库字段要建索引,这样查询效率会提高吧。
发现一点就是t4是success、wait值,是不是t4就判断这两个值呢?如果是那应该分开来这么些或许会好些:
select t1, t2, t3, t4 from A group by t1, t2, t3 where t4='success'或者t4='wait',就是先把想要的数据过滤出来,然后group by中就不要加t4了,这样效率会快些。
select a.a, aa.aa, b.b, a.t1, a.t2, a.t3, a.t4
from (select count(1) a, t1, t2, t3, t4 from A group by t1, t2, t3, t4) a
left join (select count(1) aa, t1, t2, t3, t4
from A where t4 = 'success' group by t1, t2, t3, t4) aa
on a.t1 = aa.t1
and a.t2 = aa.t2
and a.t3 = aa.t3
and a.t4 = aa.t4
left join (select count(1) b, t1, t2, t3, t4
from B group by t1, t2, t3, t4) b
on b.t1 = aa.t1
and b.t2 = aa.t2
and b.t3 = aa.t3
and b.t4 = aa.t4
因为A和B都是两个表union来的,所以A和B实际上都是嵌套的子查询。
楼主最后不得不减少了分组字段解决速度的问题,其实是放弃了查询需求来凑合了。
我认为,做不下去的原因是SQL几个很重要的缺点造成的:不能分步计算、集合化不彻底、集合没有顺序还有没有对象引用机制。
如果这个问题用Java来写,应该是分成若干步骤的,每一步都不会太复杂,优化也比较容易。而且某些中间结果是可以复用的,不用像SQL那样算多遍。
用Java写的前提条件是把数据表从库中搬出来,放到文件系统中,这样做的好处是文件数据可以预先排序。而且可以避免Java读取mysql数据库的jdbc传输缓慢的问题。
提升性能比较有效的办法是把这个任务分成三个,用不同的计算机上的Java程序同时计算,最后归并结果。也就是并行计算。并行计算对性能的提升就很明显了。
但是,Java来完成这个有点困难,一个是没有现成的group、条件过滤、结果集归并等函数,还有就是Java并行程序比较难写。
可以考虑一下集算器(esProc),可以分步计算,访问文件数据很容易,结构化类库很全,并行程序也有现成的架构,写起来比较简单。