openGauss - 向量化执行引擎 - distinct分组聚合的实现
【摘要】 openGauss向量化执行引擎中分组聚合有两种实现方式:排序和hash。本文介绍排序实现机制下的distinct分组聚合如何实现。
| 本文作者:闫宗帅
openGauss向量化执行引擎中分组聚合有两种实现方式:排序和hash。本文介绍排序实现机制下的distinct分组聚合如何实现。分组聚合也分为两种使用方式:普通group by和grouping sets等分组集,其中普通group by就是每次查询生成一个分组的聚合;而grouping sets、cube或者rollup分组集就是每次查询生成不同级别或者多个维度的聚合,详见:
下面我们看下openGauss向量化执行引擎中对这些分组聚合如何实现distinct。
1、分组聚合中怎么区分distinct?
![图片](https://res.hc-cdn.com/ecology/9.3.130/v2_resources/ydcomm/libs/images/loading.gif)
1)count(distinct id1)
2)count(id1 order by id1)
![图片](https://res.hc-cdn.com/ecology/9.3.130/v2_resources/ydcomm/libs/images/loading.gif)
![图片](https://res.hc-cdn.com/ecology/9.3.130/v2_resources/ydcomm/libs/images/loading.gif)
![图片](https://res.hc-cdn.com/ecology/9.3.130/v2_resources/ydcomm/libs/images/loading.gif)
![图片](https://res.hc-cdn.com/ecology/9.3.130/v2_resources/ydcomm/libs/images/loading.gif)
2、原理
![图片](https://res.hc-cdn.com/ecology/9.3.130/v2_resources/ydcomm/libs/images/loading.gif)
- 通过CStoreScan算子从磁盘上加载一批数据到内存,并通过VecSort向量化算子进行排序
- 从排好序的数据中(要么都在内存,要么溢出到磁盘)拿一批数据batch进行聚合操作
- 先将batch存储到m_batchSortIn中用于后续阶段的聚合:因为后续阶段也需要在有序的基础上进行分组聚合,所以m_batchSortIn用于后续阶段的排序
- 计算当前阶段的分组值
- 针对上面的分组值对distinct或order by列进行投影,并将他放到m_sortDistinct[]。Batchsortstate中,进行排序
- 从上面排好序的batchsortstate中取出一个batch,若时distinct则进行去重后再进行聚合,若为order by则直接进行聚合
- 然后对当前阶段的下组Group Key进行5)、6)操作。组号为curr_set
- 当前阶段计算完后,切换阶段进入下一个阶段聚合计算
- 下一个阶段计算前,需要先对m_batchSortIn排序,然后进行4)、5)、6)7)操作,直到所有阶段的聚合都计算完。
简单来说,distinct聚合计算就是根据distinct列,对其进行排序,然后进行比较从而去重,最后对去重后的值进行聚合计算。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)