摘要:
对聚合的多线程并行化做概要设计
https://github.com/stoneatom/stonedb/issues/422
需求分析:
功能需求:
- 与现有逻辑处理的聚合条件保持一致
- 以Aggregate函数为入口, 以ResultSender为结果输出
性能需求:
表的数据量限制:
- 物理磁盘能容纳的上限
- 存在超出内存限制
内存占用限制:
- 添加参数控制聚合时候可使用的最大的内存
- 超出限制则用临时磁盘文件
执行耗时限制:
- 相同条件下,最多与innodb的聚合查询处于相同数量级
- 以小于innodb的聚合查询耗时为目标
概要功能细分:
表元组分割:
分割目标:
- 将单线程遍历的处理的表数据,均匀的分为不同的区间, 使不同的工作线程可以独立的处理某个区间的数据
- 正确处理不同的工作线程所面临的内存可见性, 确保工作线程本身功能的完整与正确,而不会由于临界区的重叠导致不同线程工作时互相影响
面临问题:
- 如何拿到表元组的描述信息, 一共多少行,多少列,有多少个pack?
- 将表元组分区间的规则是什么, 要启动多少个工作线程, 每个工作线程处理多少区间?
- GroupByWrapper当前保存了表的完整的信息, 并且持有列的某一行是否有数据的block的标识信息, 导致无法多线程并行处理该