之所以要测该场景,是因为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. JCEF-鼠标右键菜单

    为鼠标添加自定义菜单,比较简单,实现一个Handler就行 Hanler实现类 public class MenuHandler extends CefContextMenuHandlerAdapte ...

  2. MongoDB Spark Connector 实战指南

    Why Spark with MongoDB? 高性能,官方号称 100x faster,因为可以全内存运行,性能提升肯定是很明显的 简单易用,支持 Java.Python.Scala.SQL 等多种 ...

  3. 【转】UItraEdit破解

      安装UltraEdit(一路下一步,无难点)成功后,打开软件弹出如下使用模式提示信息.   关掉UltraEdit软件,同时  断本机网络.重新打开UltraEdit软件:   点击[输入许可证密 ...

  4. 团队——Beta版本发布

    目录 最棒团队成员信息 一.7次冲刺博客链接 二.解决的Alpha版本问题 / Beta计划任务(与Alpha版本不同点) 二.项目本次α版本的发布地址.下载安装说明 四.PM最终报告(详细报告在各冲 ...

  5. 16、Python面向对象进阶

    一.对象的继承 Python中支持一个类同时继承多个父类 class Parent1: pass class Parent2: pass class Sub1(Parent1, Parent2): p ...

  6. python基础语法5 函数定义,可变长参数

    函数 1.什么是函数 函数就是一种工具. 可以重复调用 2.为什么要用函数 1.防止代码冗(rong)余 2.代码的可读性差 3.怎么用函数 1.定义函数-->制造工具 2.调用函数--> ...

  7. 学习:多字节编码(ANSI)和UNICODE编码的关系

    Windows 既可以使用 Unicode 字符集又可以使用传统的字符集(如多字节编码)来实现对多种语言的支持,以适应国际市场的要求.与传统的字符集编码相比,Unicode 是世界通用的字符编码标准, ...

  8. UFUN函数 UF_ASSEM UF_PART函数(UF_ASSEM_ask_work_part,UF_PART_ask_part_name)

    UF_initialize(); tag_t work_part_tag=NULL_TAG; ]=""; //获取当前工作部件的tag work_part_tag=UF_ASSEM ...

  9. 四、执行Python的两种方式

    第一种 交互式 ,在cmd中运行 · jupyter对这一种进行了封装 优点: 直接输出结果 缺点: 无法保存 第二种 命令式,通过cmd中输入python3文本 txt文件可以,py文件也可以,命令 ...

  10. 文件夹上传控件webupload插件

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...