之所以要测该场景,是因为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及其性能的更多相关文章

  1. 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 ...

  2. SQL模糊查询,sum,AVG,MAX,min函数

    cmd mysql -hlocalhost -uroot -p select * from emp where ename like '___' -- 三个横线, - 代表字符,可以查询 三个enam ...

  3. SQL 单表分页存储过程和单表多字段排序和任意字段分页存储过程

      第一种:单表多字段排序分页存储过程       --支持单表多字段查询,多字段排序 create PROCEDURE [dbo].[UP_GetByPageFiledOrder] ( ), --表 ...

  4. sql 单表/多表查询去除重复记录

    单表distinct 多表group by group by 必须放在 order by 和 limit之前,不然会报错 *************************************** ...

  5. sql 单表distinct/多表group by查询去除重复记录

    单表distinct 多表group by group by 必须放在 order by 和 limit之前,不然会报错 下面先来看看例子: table   id name   1 a   2 b   ...

  6. SQL单表查询案例

    表(emp)结构 (1)查询部门编号为10中所有经理,部门编号为20中所有销售员,还有即不是经理又不是销售员但其工资大或等于20000的所有员工详细资料. SELECT * FROM emp ; (2 ...

  7. sql 单表查询练习

    -- 工资高于3000的员工select * from emp where sal > 3000;-- 工资在2500和3000之间的员工select * from emp where sal ...

  8. sql单表中某一字段重复,取最近3条或几条数据

    order by a.uid,a.id; sql查询语句,针对需求:一个表中某一字段是有重复的数据,针对该字段相同的值只取最近的3条或要求的几条: --记录铭心!

  9. sql 单表操作

    前戏 --创建表 create table xxx( id int unsigned not null auto_increment primary key, name varchar(20) not ...

随机推荐

  1. kvm虚拟化之virt-install

    1. 常用参数 -n --name= 客户端虚拟机名称 -r --ram= 客户端虚拟机分配的内存 -u --uuid= 客户端UUID 默认不写时,系统会自动生成 --vcpus= 客户端的vcpu ...

  2. jq 实现切换菜单选中状态

    点击导航菜单,切换选中状态 效果: 思路:首先获取选中的URL,再通过正则判断是否相同,相同就加上相应的属性,不相同就去除相应的属性. html代码 <div class="layui ...

  3. xshell免费版

    1.说明 百度搜索xshell有时候会跳到国内的一个网站,从那个网站下载的xshell是收费的,但是国外的网站还是可以下载到免费为学生和学校使用的版本. 2.下载网址 网址:https://www.n ...

  4. 【TCP】TCP三次握手与四次挥手

    一.TCP三次握手 第一次握手:Client 将标志位 SYN=1 ,随机产生一个值 seq=J ,并将该数据包发送给 Server .此时,Client 进入SYN_SENT 状态,等待 Serve ...

  5. nmap使用流程

    ip为案列 利用ipconfig 测得本地ip为  192.00.00.100 利用-sn探测一批主机内的存活主机 存活主机ip为    192.000.00.1   192.000.00.100 使 ...

  6. linux启动脚本

    1. linux启动脚本 :  /etc/init.d/脚本例如:/etc/init.d/iptables start init.d/ 下面的每一个文件就是一个启动脚本 2. 以上的/etc/init ...

  7. Git推送文件时,出现的Couldn't load this key(OpenSSH SSH-2 private key (old PEM format))

    在进行推送到远程仓库的过程中遇到的一个错误. 解决方法: 找到这个位置 然后打开文件所在位置 再打开这个文件然后再 导入成功 然后点击save private key这个按钮 就可以成功的生成一个文件 ...

  8. 牛客NOIP暑期七天营-普及组2D

    链接:https://ac.nowcoder.com/acm/contest/926/D来源:牛客网 在一维坐标系中,给定 n条有颜色的线段,第 i条线段的左右端点分别为 li​和 ri​,此外它的颜 ...

  9. Ofbiz项目学习——阶段性小结——插入数据

    一.通用插入操作 /** * * 编写一个服务createUomOneDemo, * 该服务的作用是在表Uom中增加一条记录,其中: * 字段uomId的值为“BaseLineProduct”. * ...

  10. UI系统的分类

    1.DSL系统:UI领域特定语言 html markdown; 与平台无关,只与通用UI领域有关: 2.平台语言系统(通用语言系统) UI概念在平台和通用语言中的表示. 一.信息表达: 基本信息:文本 ...