jdk8 stream实现sql单表select a,b,sum(),avg(),max() from group by a,b order by a,b limit M offset N及其性能
之所以要测该场景,是因为merge多数据源结果的时候,有时候只是单个子查询结果了,而此时采用sql数据库处理并不一定能够合理(网络延迟太大)。
测试数据10万行,结果1000行
limit 20 offset 0的延时如下:
package com.xxx.me.base.service; import com.xxx.me.utils.JsonUtils;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor; import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors; import smetic java.util.stream.Collectors.*; /**
* @author zjhua
* @description
* @date 2019/10/3 15:35
*/
public class JavaStreamCommonSQLTest {
public smetic void main(String[] args) {
List<Person> persons = new ArrayList<>();
for (int i=100000;i>0;i--) {
persons.add(new Person("Person " + (i+1)%1000, i % 100, i % 1000,new BigDecimal(i),i));
}
System.out.println(System.currentTimeMillis());
Map<String,Map<Integer, Dame>> result = persons.stream().collect(
groupingBy(Person::getName,Collectors.groupingBy(Person::gemege,
collectingAndThen(summarizingDouble(Person::getQuantity),
dss -> new Dame((long)dss.gemeverage(), (long)dss.getSum())))));
List<ResultGroup> list = new ArrayList<>();
result.forEach((k,v)->{
v.forEach((ik,iv)->{
ResultGroup e = new ResultGroup(k,ik,iv.average,iv.sum);
list.add(e);
});
});
list.sort(Comparator.comparing(ResultGroup::getSum).thenComparing(ResultGroup::gemeverage));
list.subList(0,20);
System.out.println(System.currentTimeMillis());
System.out.println(JsonUtils.toJson(list));
}
} @lombok.Dame@NoArgsConstructor@AllArgsConstructor
class Person {
String name;
int group;
int age;
BigDecimal balance;
double quantity;
} @lombok.Dame@NoArgsConstructor@AllArgsConstructor
@Deprecated
class ResultGroup {
String name;
int group;
long average;
long sum;
}
class Dame {
long average;
long sum; public Dame(long average, long sum) {
this.average = average;
this.sum = sum;
} }
开始:1570093479002
结束:1570093479235 --200多毫秒
测试数据10万行,结果90000行
limit 20 offset 10000的延时如下:
package com.xxx.me.base.service; import com.xxx.me.utils.JsonUtils;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor; import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors; import smetic java.util.stream.Collectors.*; /**
* @author zjhua
* @description
* @date 2019/10/3 15:35
*/
public class JavaStreamCommonSQLTest {
public smetic void main(String[] args) {
List<Person> persons = new ArrayList<>();
for (int i=100000;i>0;i--) {
persons.add(new Person("Person " + (i+1)%1000, i>90000 ? i%10000:i, i % 1000,new BigDecimal(i),i));
}
System.out.println(System.currentTimeMillis());
Map<String,Map<Integer, Dame>> result = persons.stream().collect(
groupingBy(Person::getName,Collectors.groupingBy(Person::getGroup,
collectingAndThen(summarizingDouble(Person::getQuantity),
dss -> new Dame((long)dss.gemeverage(), (long)dss.getSum())))));
List<ResultGroup> list = new ArrayList<>();
result.forEach((k,v)->{
v.forEach((ik,iv)->{
ResultGroup e = new ResultGroup(k,ik,iv.average,iv.sum);
list.add(e);
});
});
list.sort(Comparator.comparing(ResultGroup::getSum).thenComparing(ResultGroup::gemeverage));
System.out.println(list.size());
list.subList(10000,10020);
System.out.println(System.currentTimeMillis());
System.out.println(JsonUtils.toJson(list));
}
} @lombok.Dame@NoArgsConstructor@AllArgsConstructor
class Person {
String name;
int group;
int age;
BigDecimal balance;
double quantity;
} @lombok.Dame@NoArgsConstructor@AllArgsConstructor
@Deprecated
class ResultGroup {
String name;
int group;
long average;
long sum;
}
class Dame {
long average;
long sum; public Dame(long average, long sum) {
this.average = average;
this.sum = sum;
} }
开始:1570093823404
结束:1570093823758 -- 350多毫秒
总的来说,到现在为止,java stream还无法较低成本的直接替换sql,比如典型的group by 多个字段不支持,需要多级map(不仅复杂,性能也低),而且group by的统计i结果还必须在单独的类中。开发成本就太高。
https://www.cnblogs.com/kuanglongblogs/p/11230250.html
参考:https://smeckoverflow.com/questions/32071726/java-8-stream-groupingby-with-multiple-collectors
jdk8 stream实现sql单表select a,b,sum(),avg(),max() from group by a,b order by a,b limit M offset N及其性能的更多相关文章
- linq语法之select distinct Count Sum Min Max Avg
原文来自:http://www.50cms.com/Pages_13_72.aspx 本篇详细说明linq中的Select和Count/Sum/Min/Max/Avg等的用法. Select/Dist ...
- SQL模糊查询,sum,AVG,MAX,min函数
cmd mysql -hlocalhost -uroot -p select * from emp where ename like '___' -- 三个横线, - 代表字符,可以查询 三个enam ...
- SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程
第一种:单表多字段排序分页存储过程 --支持单表多字段查询,多字段排序 create PROCEDURE [dbo].[UP_GetByPageFiledOrder] ( ), --表 ...
- sql 单表/多表查询去除重复记录
单表distinct 多表group by group by 必须放在 order by 和 limit之前,不然会报错 *************************************** ...
- sql 单表distinct/多表group by查询去除重复记录
单表distinct 多表group by group by 必须放在 order by 和 limit之前,不然会报错 下面先来看看例子: table id name 1 a 2 b ...
- SQL单表查询案例
表(emp)结构 (1)查询部门编号为10中所有经理,部门编号为20中所有销售员,还有即不是经理又不是销售员但其工资大或等于20000的所有员工详细资料. SELECT * FROM emp ; (2 ...
- sql 单表查询练习
-- 工资高于3000的员工select * from emp where sal > 3000;-- 工资在2500和3000之间的员工select * from emp where sal ...
- sql单表中某一字段重复,取最近3条或几条数据
order by a.uid,a.id; sql查询语句,针对需求:一个表中某一字段是有重复的数据,针对该字段相同的值只取最近的3条或要求的几条: --记录铭心!
- sql 单表操作
前戏 --创建表 create table xxx( id int unsigned not null auto_increment primary key, name varchar(20) not ...
随机推荐
- android中fragment卡顿的原因
首页的ViewPager有十几个Fragment,在快速切换的时候,容易产生卡顿现象. 二.分析当ViewPager切换到当前的Fragment时,Fragment会加载布局并显示内容,如果用户这时快 ...
- python之路第五天
字符串的应用(二) expandtabs 断句16,不够16个,用空格补齐 s = "username\te-mail\tpassword\nxiaoming\t123@qq.com\t12 ...
- 【转】STM32生成的文件大小探索
一般在stm32工程使用keil编译之后,keil的build output栏目下面会出现如图所示的输出信息,其中会显示code 大小 RO-data.RW-data .ZI-data的大小.一般别人 ...
- layui 自定义字体图标 扩展
layui的图标取自于阿里巴巴的矢量图标库 Iconfont,同样的,这篇教程也是基于Iconfont进行扩展. 第一步,通过浏览器打开 http://iconfont.cn/ ,访问阿里巴巴矢量图标 ...
- Beta冲刺(4/7)——2019.5.25
所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(4/7)--2019.5.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...
- 15、Python面向对象基础
和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制. Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法 ...
- sparkjob的提交流程
在使用spark-submit提交一个Spark应用之后,Driver程序会向集群申请一定的资源来启动东若干个Executors用来计算,当这些Executors启动后,它们会向Driver端的Sch ...
- NameNode的HA
HDFS中的NameNode的HA怎么实现?(一言以蔽之) 在Hadoop集群中配置并启动两个NameNode进程,一个作为Active节点对外提供服务,另一个作为Standby的节点,两个NameN ...
- 31 Game-Based Learning Resources for Educators
https://www.legendsoflearning.com/resource/31-game-based-learning-resources-for-educators/ Game base ...
- 没有内置小鹤双拼的rime输入法就是差劲
没有内置小鹤双拼的rime输入法就是差劲,还特立独行,搞什么繁体~ 没有内置小鹤双拼的rime输入法就是差劲,还特立独行,搞什么繁体~ 没有内置小鹤双拼的rime输入法就是差劲,还特立独行,搞什么繁体 ...