PostgreSQL 源码解读(181)- 查询#97(聚合函数#2-ExecInitAgg)


本节简单介绍了PostgreSQL执行聚合函数时的初始化工作,主要实现函数是ExecInitAgg.


AggState


聚合函数执行时状态结构体,内含AggStatePerAgg等结构体

ExecInitAgg为优化器生成的agg节点创建运行期信息并初始化outer子树(左树).

其主要实现逻辑如下:

1.初始化AggState结构体

2.计算分为几个阶段(Hash vs Group)

3.如存在grouping set,则初始化相关信息

4.分配内存上下文

5.初始化outer plan子节点

6.初始化结果类型,slot和投影

7.初始化子表达式

8.为AggStatePerPhaseData等结构体分配内存

9.循环遍历各个阶段

9.1计算分组列,存储在phasedata->grouped_cols数组和all_grouped_cols中

9.2初始化AggState->phases数组(数组元素对应的结构体为AggStatePerPhase)

9.3初始化AggState->perhash数组(对应的结构体为AggStatePerHash)

10.转换all_grouped_cols为倒序链表

11.在输出expr上下文中设置aggregate-result存储,同时分配私有per-agg工作存储

12.如使用Hash算法,则调用find_hash_columns和build_hash_table方法初始化相关数据

13.调用initialize_phase/select_current_set初始化阶段数据

14.检索聚合函数信息,初始化per-agg和per-trans数据不可变字段

15.构建一次就完成所有转换工作的表达式.

测试脚本

跟踪分析

输入参数

使用Hash算法计算

1.初始化AggStat免费云主机域名e结构体

2.计算分为几个阶段(Hash vs Group)

Hash只需要一个阶段,执行Hash

3.如存在grouping set,则初始化相关信息

这里没有grouping set,不需要初始化相关信息

4.分配内存上下文

5.初始化outer plan子节点

outer(左树)节点为SeqScan,顺序全表扫描.

6.初始化结果类型,slot和投影

7.初始化子表达式

表达式为NULL,一共有3个聚合函数

8.为AggStatePerPhaseData/AggStatePerHashData等结构体分配内存

9.循环遍历各个阶段

9.1计算分组列,存储在phasedata->grouped_cols数组和all_grouped_cols中

9.2初始化AggState->phases数组(数组元素对应的结构体为AggStatePerPhase)

9.3初始化AggState->perhash数组(对应的结构体为AggStatePerHash)

10.转换all_grouped_cols为倒序链表

11.在输出expr上下文中设置aggregate-result存储,同时分配私有per-agg工作存储

12.如使用Hash算法,则调用find_hash_columns和build_hash_table方法初始化相关数据

13.调用initialize_phase/select_current_set初始化阶段数据

14.检索聚合函数信息,初始化per-agg和per-trans数据不可变字段

下一个循环

第3遍循环

15.构建一次就完成所有转换工作的表达式.

最终结果

AggState结构体

AggState->phase

AggState->peragg

AggState->pertrans

AggState->groups相关

AggState->perhash

DONE!


尚有不少细节需要整理

N/A

相关推荐: 数据迁移中碰见的一些问题

单位有一套Oracle 9i的古老测试数据库,因为机房搬迁,所以需要迁移数据,新库是Oracle 11g了,一个比较简单的需求,但过程中碰见了一些问题,看似比较琐碎,值得总结一下。 由于源库是9i,因此只能用imp/exp,不能用数据泵。 问题1:导入目标库用…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 12/31 21:06
下一篇 12/31 21:07