java上亿数据如何秒查,怎么更快速的查询1000条数据

如何更快速的查询1000条数据?

现在的需求是这样的,我有一个模板,里面是JsonArray数据,里面有1000条JSONObject,每个object都有一个客户和产品属性,形如这样{"data":[{"account":"01","product":"p1"},...]}

我现在要解析这个JSON,根据每一个object里的客户和产品,到另一个表里来查询它的平均销量和平均单价,

然后返回一个加了平均销量和平均单价的data,就是这样{"data":[{"account":"01","product":"p1","avgNum":111,"avgPrice":222},...]}

我现在的做法是循环data,取出每个object,然后取出object的Account和Product,然后到一个查询方法里查询取得数据后,object.put("avgNum","")...;

这样一番下来,整个过程耗时26秒,可以说非常慢,另附上我的查询方法

String sql="SELECT avg(il.UnitPrice),sum(il.Quantity)/12 FROM Invoice i LEFT  JOIN InvoiceLineItem  il " +

"ON i.InvoiceId=il.InvoiceId " +

"LEFT JOIN Product p ON p.ProductId=il.ProductId "+

"LEFT JOIN Account a ON i.AccountId=a.AccountId "+

"WHERE datediff(m,InvoicedOn,getDate())<=12 " +

"AND p.ProductNumber=? AND a.AccountName=? ";

...

for(int i=0;i

JSONObject o=jArray.getJSONObject(i);

if(o.isEmpty())

break;

ps.setString(1,o.getString("product"));

ps.setString(2,o.getString("account"));

rs=ps.executeQuery();

Map map=new HashMap();

map.put("$$avgPrice",0);

map.put("$$avgNum",0);

while(rs.next()){

map.put("$$avgPrice",  rs.getDouble(1));

map.put("$$avgNum", rs.getDouble(2));

}

o.putAll(map);

}不知道各位有什么好的主意,集思广益,

------解决方案--------------------

就不能一次全提出来?还要弄了个 for 循环,反复数据库操作

------解决方案--------------------

楼上所说甚对啊。如果说你的JsonArray也是从数据库里取出来封装好的,你完全可以用一个sql将你要的平均价格和数量一并都取出来啊,就是sql实现,最起码比你现在的思路要效率很多。

------解决方案--------------------

真正慢的是你的sql语句,连4张表查

------解决方案--------------------

引用:Quote: 引用:就不能一次全提出来?还要弄了个 for 循环,反复数据库操作

引用:楼上所说甚对啊。如果说你的JsonArray也是从数据库里取出来封装好的,你完全可以用一个sql将你要的平均价格和数量一并都取出来啊,就是sql实现,最起码比你现在的思路要效率很多。

模板里面是没有平均销量那些的,只有客户和产品,我也想过用一条SQL语句,奈何实在想不出来,因为JSONArray里的客户和产品是不固定的,有可能重复等等,如何才能用一条语句就搞定,还得请教

10364524.gif

引用:真正慢的是你的sql语句,连4张表查有何高效语句,还望解答貌似真没有

10364525.gif,看到left join 就有强迫症要去掉

------解决方案--------------------

我也是,我看到left join我就想吐,我没有看明白你用个for是干嘛的,干嘛用这个呀,你一次性全拿出来不行吗?

------解决方案--------------------

你也可以单个表的查,在用程序组合起来啊 !

------解决方案--------------------

不能搞个存储过程吗?

------解决方案--------------------

"AND p.ProductNumber in (?,?,?) AND a.AccountName=(?,?,?) ";

?的个数由for循环定(ps.setString也一样),这样一次查询就可以得到所有结果,然后再打印

------解决方案--------------------

1000次查询26秒,平均每次查询0.026秒,应该说不算慢。

12L的代码虽然不对,但是那种拼接SQL的方式应该可以减少查询次数。

其实,对于Oracle之类的数据库而言,

可以用类似以下的方式构造SQL语句

SELECT t.id, avg(il.UnitPrice),sum(il.Quantity)/12 FROM

(

SELECT 0 as id, 'a0' as AccountName, 'b0' as ProductNumber from dual

union all

SELECT 1 as id, 'a1' as AccountName, 'b1' as ProductNumber from dual

union all

SELECT 2 as id, 'a2' as AccountName, 'b2' as ProductNumber from dual

union all ...

) t

INNER JOIN Product p ON p.ProductNumber = t.ProductNumber

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值