sharding-jdbc源码学习笔记(四)----并发执行和结果归并

本文探讨了在多数据库环境中并发执行SQL查询的方法,并提出了针对不同查询需求(如排序、聚合等)的结果归并策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,并发执行sql问题,多库同时并发,提高效率。
如果是执行单条sql,在当前线程执行;
如果是执行多条sql在不同的库中或者同一个库中多个表里面,当前线程执行第一条sql,使用线程池执行其他的sql。
比如查询某个商户下面所有的账户,账户可能根据id规则分布在不同的数据库中,需要执行分片个数条sql,需要并发执行查询。

二,结果归并汇总,多库查询后,需要对结果进行加工,才能得出正确的数据。
1,无排序,无聚合函数,无分页的多库查询结果合并
这种是最简单的一种情况,多条sql执行后,得到多个resultSet,把多个resultSet简单合并,
遍历每个resultSet执行resultSet.next()获取数据记录即可,每次获取1条记录。
比如查询某个商户下面所有的账户,账户可能根据id规则分布在不同的数据库中,需要执行分片个数条sql,结果合并就是这种情况。

2,有排序,无聚合函数,无分页的多库查询结果合并
多条sql执行后,得到多个resultSet,把多个resultSet放入一个排序队列中,按每个resultSet的第一条记录排序,每次出队第一条记录,
相当于每次取多个resultSet中排序后记录最小或者最大的那条。

3,有排序,有聚合函数,并且排序和聚合字段相同,无分页的结果合并
a,按聚合(或排序)字段排序:多条sql执行后,得到多个resultSet,把多个resultSet放入一个排序队列中,按每个resultSet的第一条记录排序,每次出队第一条记录,
相当于每次取多个resultSet中排序后记录最小或者最大的那条。
b,按顺序取出记录后,把聚合字段值相同的记录里面的聚合字段值进行统计,sum,count,max,min四种。
如果聚合字段值变了,再次重新开始统计。每次统计后形成一条真正的记录对外输出。
c,对于avg函数,对外输出记录的时候,计算得出avg = sum/count

4,有分页的情况
对应上面几种情况的结果,按分页偏移量信息,忽略偏移量前面的记录,从偏移量位置开始真正输出。


5,有排序,有聚合函数,并且排序和聚合字段不相同,无分页的结果合并
这个场景支持在内存中聚合和排序,注意大数据量导致内存溢出。
a,遍历每一个查询的结果集里面的每一条记录,按聚合字段进行聚合计算。
b,聚合计算结果再按排序字段进行排序。

转载于:https://my.oschina.net/u/3522232/blog/1555889

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值