之所以要测该场景,是因为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. 金融finaunce财经

    金融 (经济学术语) 金融是货币资金融通的总称.主要指与货币流通和银行信用相关的各种活动.主要内容包括: 货币的发行.投放.流通和回笼:各种存款的吸收和提取:各项贷款的发放和收回:银行会计.出纳.转账 ...

  2. 基础的python数据分析

    1. 单行注释 #print("hello word;") 2. 多行注释 ''' print("hello word;") print("hello ...

  3. Django模型层(models.py)之模型创建

    Django数据库操作是十分重要的内容,这两天简单学习了数据库的操作,这里做个总结. 1.ORM简介 简单的来说,ORM就是对象-关系-映射.它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖 ...

  4. mac下比较好用的svn软件,SVN客户端CornerStone 2.7.10 破解版

    一.已经破解,可以直接使用. dmg文件无密码,也不需要注册机.直接使用即可     二. 界面... 三.添加repository 点击左侧栏中REPOSITORY那一栏的+选择添加reposito ...

  5. c#时间与时间戳互转13位

    Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00 ...

  6. nohup 、&、 2>&1 命令分析

    nohup的意思是不间断的运行,&的意思是后台运行,2>&1的意思是标准输出和错误输出都重定向到同一个文件. 简单地说nohup运行时即使关掉控制台,它该运行还是运行. http ...

  7. 浅谈JS之Error对象

    [前言] 本文主要介绍下JS的Error name相关属性.   当 JS 引擎执行 JS代码时,会发生各种错误. ①语法错误,通常是程序员造成的编码错误或错别字: ②拼写错误或语言中缺少的功能(可能 ...

  8. Alibaba Java Coding Guidelines,以后我的Java代码规范,就靠它了

    前言 对于Java代码规范,业界有统一的标准,不少公司对此都有一定的要求.但是即便如此,庞大的Java使用者由于经验很水平的限制,未必有规范编码的意识,而且即便经验丰富的老Java程序员也无法做到时刻 ...

  9. LGOJP3193 [HNOI2008]GT考试

    \(f[i][j]\)表示当前摆放到第\(i\)位,然后当前的匹配长度为\(j\) \(f[i][j]=\sum {f[i][k]*g[k][j]}\) \(g[i][j]\)表示将长度为\(i\)的 ...

  10. Discuz!基础的代码安全和代码规范

    变量所有漏洞都来源于变量,因此变量首先要做的就是定义初始化.用任何一个变量前一定要先定义,初始化它虽然现在Discuz!X来说,GPC不会被全局覆盖了,但是大家写插件的过程中也不要忽视了因为在服务器p ...