这种情况怎么优化?请求大佬帮忙

努力成为头像的样子 2020-11-17 02:50:37
我自己就想到两种方式,但感觉都不好。

第一种:

String sql = "SELECT finishclass,finishtm from" +
" (select state finishclass,createtm finishtm,ROW_NUMBER() OVER(PARTITION BY state ORDER BY createtm desc) rn" +
" from PERSONAL_FINISHINFO_T where 1=1 and applyid =" + subsidyId + ") where rn = 1";
List<Map<String, Object>> list = queryBySql(sql);
Iterator<Map<String, Object>> iterator = list.iterator();
Map<String, Object> map = new HashMap<>();
while (iterator.hasNext()){ // 10条数据
Map<String, Object> next = iterator.next();
map.put(next.get("finishclass")+"",next.get("finishtm")+"");
}
---------------------------------------------------------------分开,不在同个类,有些省略了
List<Map<String, Object>> mapList = subsidyApplyService
.listSubsidyCustom(paramMap,nameSet);
for (Map map : mapList ) { //5000+数据
Map<String, Object> finishInfo = subsidyApplyService.lastFinishInfo(map.get("SUBSIDYID").toString());
if(finishInfo != null){
map.put("PRELEXADATE", finishInfo.get("1") == null ? "" : finishInfo.get("1")+"");
map.put("ONSITEAUDITDATE", finishInfo.get("4") == null ? "" : finishInfo.get("4")+"");
map.put("FIRSTFINISHDATE", finishInfo.get("5") == null ? "" : finishInfo.get("5")+"");
map.put("SECONDFINISHDATE", finishInfo.get("6") == null ? "" : finishInfo.get("6")+"");
map.put("THIRDFINISHDATE", finishInfo.get("7") == null ? "" : finishInfo.get("7")+"");
map.put("FINANCIALAUDIT", finishInfo.get("99") == null ? "" : finishInfo.get("99")+"");
}
}


第二种:

String sql = "SELECT finishclass,finishtm from" +
" (select state finishclass,createtm finishtm,ROW_NUMBER() OVER(PARTITION BY state ORDER BY createtm desc) rn" +
" from PERSONAL_FINISHINFO_T ) where rn = 1";
List<Map<String, Object>> list = queryBySql(sql);
Iterator<Map<String, Object>> iterator = list.iterator();
Map<String, Object> map = new HashMap<>();
Map<String, Object> map1 = new HashMap<>();
while (iterator.hasNext()){ //20+万条数据
Map<String, Object> next = iterator.next();
map.put(next.get("finishclass")+"",next.get("finishtm")+"");
if(map1.keySet().contains(next.get("ID")+"")){
Map<String, Object> idMap = (Map<String, Object>) map1.get("ID");
map.putAll(idMap);
}
map1.put(next.get("ID")+"",map);
}
---------------------------------------------------------------分开,不在同个类,有些省略了
List<Map<String, Object>> mapList = subsidyApplyService
.listSubsidyCustom(paramMap,nameSet);
for (Map map : mapList ) { //5000+数据
Map<String, Object> finishInfo = (Map<String, Object>) map1.get(map.get("SUBSIDYID")+"");
if(finishInfo != null){
map.put("PRELEXADATE", finishInfo.get("1") == null ? "" : finishInfo.get("1")+"");
map.put("ONSITEAUDITDATE", finishInfo.get("4") == null ? "" : finishInfo.get("4")+"");
map.put("FIRSTFINISHDATE", finishInfo.get("5") == null ? "" : finishInfo.get("5")+"");
map.put("SECONDFINISHDATE", finishInfo.get("6") == null ? "" : finishInfo.get("6")+"");
map.put("THIRDFINISHDATE", finishInfo.get("7") == null ? "" : finishInfo.get("7")+"");
map.put("FINANCIALAUDIT", finishInfo.get("99") == null ? "" : finishInfo.get("99")+"");
}
}


直接在主数据那拼接也试过,很慢很慢。可能是我拼接的不好,用的子查询拼接,也是每个状态都要查一次再case when。

...全文
8970 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 4 楼 大叔obnijeh 的回复:
导出Excel的话也改一下设计,压力不要放在你程序里。我上次叫你优化的做了没有?即在表的ID及where条件后面的所有字键先好引索。 这个导出可以看作是一个固定报表,你的java程序只要一条SQL不需要字查询,where语句不也不要有子查询。那怎么做的呢?把你现在一堆SQL在数据库里做预处理,存放到一个表AAA中,你java程序只需要查这个表AAA,其它不优化全部是预处理来实现。如果数据超过3千万,就不要用java+sql这种模式。要考虑用ETL,比如:kettle等。
参照你说的改了,性能提升年不少。谢谢你,不好意思,因为最近挺忙的,忘了回复。
大叔obnijeh 2020-11-22
  • 打赏
  • 举报
回复
导出Excel的话也改一下设计,压力不要放在你程序里。我上次叫你优化的做了没有?即在表的ID及where条件后面的所有字键先好引索。 这个导出可以看作是一个固定报表,你的java程序只要一条SQL不需要字查询,where语句不也不要有子查询。那怎么做的呢?把你现在一堆SQL在数据库里做预处理,存放到一个表AAA中,你java程序只需要查这个表AAA,其它不优化全部是预处理来实现。如果数据超过3千万,就不要用java+sql这种模式。要考虑用ETL,比如:kettle等。
  • 打赏
  • 举报
回复
导出Excel用的。 在第二种那加了个条件,数据量没那么多了,不过还是要循环上万次 String sql = "SELECT finishclass,finishtm from" + " (select state finishclass,createtm finishtm,ROW_NUMBER() OVER(PARTITION BY state ORDER BY createtm desc) rn" + " from PERSONAL_FINISHINFO_T where existi *** ) where rn = 1";
liuyh1024 2020-11-18
  • 打赏
  • 举报
回复
为什么不直接使用数据库,这样执行效率太慢了。
大叔obnijeh 2020-11-17
  • 打赏
  • 举报
回复
1.SQL上的优化,在表的ID及where条件后面的所有字键先好引索(先不管它引索是否合理,先建引索,听我的,看一下查询速度提升了没有) 2.查这么多出来,肯定是要插入的,如果是要插入,不要用Insert.把它放到文件中,如txt,然后使用LOAD语句导入。每种数据库都有自己LOAD的写法。查一下就可以找到。 3.如果是返回给其它接口或程序使用,不要这种方式,也不要http这种传输字节流,可以考虑使用数据库或者是FTP,或是传zip文件,让对方接口解析zip就可以了。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧