PgSQL HashAgg算法 | 第2期 | 版本12的spill溢出磁盘解秘

news2025/2/6 7:42:33

PgSQL HashAgg算法 | 第2期 | 版本12的spill溢出磁盘解秘

HashAgg需要在内存中构建Hash表,以此来构建聚合分组;但是当数据量大到内存放不下时,就需要spill溢出到磁盘;构建好当前hash表并输出分组值后,再将磁盘上的spill文件中数据加载重新构建hash表并构建聚合分组。PgSQL在演进过程中,有两种spill磁盘方式,本期介绍如何spill并根据磁盘临时文件构建聚合分组。

21574093885497860de5ac314c2cddbd.png

Spill的管理方式如上图所示,源头信息都存放在AggState中,分布为HashTapeInfo* hash_tapeinfo和HashAggSpill* hash_spills。

1)num_hashes为分组聚合中Hash Keys分组集个数,比如group by grouping sets((id1),(id2),(id3))中,就由3个分组集,即num_hashes值为3

2)hash_tapeinfo为该AGG使用的临时文件的tapes信息,其中ntapes为tape总个数,会有回收和复用,空闲tape由freetapes管理

3)LogicalTapeSet包含一个BufFile* pfile,管理着多个文件,当一个临时文件写满1GB后,会写如下一个文件

4)LogicalTapeSet还管理LogicalTape* tapes数组

5)再返回到AggState结构中,HashAggSpill* hash_spills数组大小为num_hashes个数,也就是每个分组集对应一个hash_spills[]

6)HashAggSpill由一个partitions数组,存放着分配的tapes[]下标号。Tapes写到磁盘时,buffer的尾部会有一个结构TapeBlockTrailer,保存前后block号,这样形成一个链表,读时,通过该链表将同一个tabpes[]的数据读取出来

9f6952d70912205dd4898d0bb5ca3cfd.png

因为写入的时候,根据hash值确定使用哪个tapes[],所以一个tapes[]中存放的近似一个分组的所有值(由于会有hash冲突场景,也包括不是一个分组的值)

简单了解数据读写管理后,我们接着看下HashAgg的spill流程

bd1b9cea7e3fb924eea3e7bade68133d.png

agg_fill_hashtable构建hash表,然后通过agg_retrieve_hash_table从hash表中获取分组聚合值,若有spill,则hash表取完后,再从磁盘临时文件加载重新构建下一批分组聚合的hash表。

1)agg_fill_hash_table调用lookup_hash_entries构建所有set的hash表;调用hashagg_finish_initial_spills处理所有临时文件的元数据

2)lookup_hash_entries对所有Hash Key组进行构建hash表,若一个Hash key组的hash表构建过程中发生spill磁盘,则后面其他Hash Key组的hash表全部会spill磁盘

3)首先每个Hash Key组通过调用hashagg_spill_init初始化各自的HashAggSpill,管理各自的partitions[]数组等

4)hashagg_spill_tuple将tuple写到Hash Key组对应的tape链表,当然是统一写到一个文件,当文件满1GB则写入下一个文件。写下去的tuple包括所有需要的列,不仅仅是当前set需要的列

5)所有set全部spill完后,调用hashagg_spill_finish,遍历各自的partitions[]数组,每个tape形成一个HashAggBatch,记录有setno和tapenum,最终将所有HashAggBatch构建成一个链表hash_batches

6)agg_retrieve_hash_table先调用agg_retrieve_hash_table_in_memory从hash表取出分组值,取完后再调用agg_refill_hash_table从磁盘文件中读取记录重新构建hash表,并计算分组聚合值

7)agg_refill_hash_table可知从hash_batches链表取出一个HashAggBatch,得到setno和tapenum,从而从临时文件中读取该tape的所有值构建到hash表中。本次是一个tape的构建,弄好后,需要从hash表输出,之后再次进入该函数,重新从hash_batches链表取一个HashAggBatch继续下一个tape的读取

8)这里需要注意,有可能会再次spill,并且可能写到之前同一个临时文件中,并追加到同一个链表hash_batches。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2056517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端使用 Konva 实现可视化设计器(21)- 绘制图形(椭圆)

本章开始补充一些基础的图形绘制,比如绘制:直线、曲线、圆/椭形、矩形。这一章主要分享一下本示例是如何开始绘制一个图形的,并以绘制圆/椭形为实现目标。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug&#xff0c…

8.20又开新课:今日IO进程线程

1、fgetc和fputc拷贝文件。 #include <myhead.h>int main(int argc, const char *argv[]) {/**/if(argc ! 3){printf("外部参数错误\n");return -1;}FILE *fp1 fopen("./1.txt","r");if(NULL fp1){perror("fp1");return -1;}…

访问不了ChatGPT?这篇文章你看了吗?

官网下载 PC版下载 安卓下载 IOS下载 言简意赅&#xff0c;直接进入主题&#xff0c;如下图&#xff1a; 该软件支持电脑版和手机版&#xff0c;可以下载对应的应用安装就可以使用&#xff08;每天签到送一个小时&#xff09; 大概等个几分钟&#xff08;期间可以不断刷新&…

网络编程思维导图

8/20 面试题 问题一 :c语言中指针数组与数组指针的区别 指针数组 1>本质上是一个数组&#xff0c;只是每个数组元素都是一个指针变量 2>定义格式&#xff1a;数据类型 *数组名[数组长度]; 数组指针 1>本质上是一个指针&#xff0c;用于存储整个数组的起始地址&…

QT实现自定义侧边导航栏

侧边导航栏是网页或应用程序界面的一种常见布局&#xff0c;它通常位于页面或应用程序的侧边位置&#xff0c;用来展示导航菜单或功能链接&#xff0c;方便用户快速访问不同的页面或功能。 侧边导航栏一般具有以下特点&#xff1a; 布局紧凑&#xff1a;侧边导航栏通常采用垂直…

实用工具:[TrafficMonitor]任务栏电脑性能监控安装指南

实用工具&#xff1a;[TrafficMonitor]任务栏电脑性能监控安装指南 效果图 话不多说&#xff0c;直接上软件效果图&#xff1a; 内容介绍 支持监控的指标&#xff1a; 上传下载CPU利用率内存利用率CPU温度总网速CPU频率显卡利用率显卡温度硬盘温度主板温度硬盘利用率 一共…

三千元左右的卧室投影仪怎么选?当贝D6X Pro代替电视的最佳选择

想象一下&#xff0c;在舒适的卧室中&#xff0c;只需轻轻一瞥&#xff0c;便能享受一场视觉盛宴&#xff0c;无需起身&#xff0c;天花板即成为你的私人影院。这一梦想现已成真&#xff0c;只需挑选一台合适的卧室投影仪&#xff0c;即可实现这一愿望。 下面是2024年卧室投影仪…

DLL修复工具哪个好用?分享电脑丢失dll文件一键修复方法,快速修复!

电脑丢失dll文件一键修复都有哪些方法&#xff1f;想必很多小伙伴都对dll文件了解颇少&#xff0c;不过电脑倒是出现过很多次关于dll文件丢失的问题。本文就和大家分享一下dll文件是什么&#xff1f;如果电脑出现dll文件缺失的情况应该如何修复&#xff0c;一起来学习下吧&…

llama3 结构详解

文章目录 1. Llama3 整体结构2. 模块详解2.1 模块1: Embeddings2.2 模块2: RoPE2.3 模块3: Transformer Block2.4 模块4: RMSNorm2.5 模块5: Attention2.6 模块6: ADD2.7 模块7: FFN2.8 模块8: Linear 1. Llama3 整体结构 llama3 的整体结构还是延续transformer decoder 架构&a…

【计算机组成原理】二、数据的表示和运算:1.数值与编码(十进制二进制转换、BCD码、ASCII码、汉字编码、奇偶校验码、循环冗余检测CRC、海明码)

二、数据的表示和运算 文章目录 二、数据的表示和运算1.数值与编码1.1数据存储和排列❗1.2十进制转换1.2.1整数1.2.2小数 1.3二进制转换1.3.1 B->O1.3.2 B->H 1.4真值&机器数1.5 BCD码1.6 ASCII码1.7汉字与GBK1.8 UTF1.9检错码1.9.1奇偶校验码1.9.2循环冗余检测CRC1.…

鸿蒙Harmony实战:常用命令交互工具—“hvigorw”

hvigor通过hvigorw工具&#xff0c;实现命令行交互。 命令行使用方式 hvigorw [taskNames...] <options> 常用命令 查询 选项 说明 -h, --help 打印hvigor的命令帮助信息。 -v, --version 打印hvigor版本信息。 编译构建 选项 说明 clean 清理构建产物buil…

启动团队活力:5款互动游戏助力新人快速融入

在加入新团队时&#xff0c;很多人都会感到尴尬和不适应。作为团队的领导者&#xff0c;帮助新成员顺利融入团队是至关重要的。组织一场“破冰游戏”是一个有效的策略&#xff0c;不仅可以活跃团队气氛&#xff0c;还能促进成员之间的交流和理解。这时候&#xff0c;团队的领导…

ReFT: reasoning with reinforced Fine-Tuning

从一个question中看到多种多样的cot&#xff0c;都可以从中学习。 offline self-training 数据的质量是模型自己来定义的。 思考增加或者减少一条数据&#xff0c;对于模型训练的影响。 用influence function来衡量新增一条数据对于模型训练的整体的影响。 高质量的数据能够…

深度学习Day-30:CGAN入门丨生成手势图像丨可控制生成

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 要求&#xff1a; 结合代码进一步了解CGAN学习如何运用生成好的生成器生成指定图像 一、 基础配置 语言环境&#x…

功能测试与自动化测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 什么是自动化测试? 自动化测试是指利用软件测试工具自动实现全部或部分测试&#xff0c;它是软件测试的一个重要组成 部分&#xff0c;能完成许多手工测试无法实…

【C++】————智能指针

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年8月20日 一&#xff0c;什么是智能指针 在C中没有垃圾回收机制&#xff0c;必须自己释放分配的内存&#xff0c;否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针&…

传染病防控宣传小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;防控知识管理&#xff0c;医院信息管理&#xff0c;健康上报管理&#xff0c;医疗捐赠管理&#xff0c;捐赠信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首…

力扣面试经典算法150题:买卖股票的最佳时机 II

买卖股票的最佳时机 II 今天的题目是力扣面试经典150题中的数组的中等难度题&#xff1a;买卖股票的最佳时机 II。 题目链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150 问…

EfficientFormer 系列算法

1. EfficientFormer V1 模型 论文地址&#xff1a;https://proceedings.neurips.cc/paper_files/paper/2022/file/5452ad8ee6ea6e7dc41db1cbd31ba0b8-Paper-Conference.pdf EfficientFormer V1 基于 ViT 的模型中使用的网络架构和具体的算子&#xff0c;找到端侧低效的原因。然…

深入剖析资产负债率与净资产收益率,掌握财务报表解读技巧

一、概述 财务报表中蕴含了丰富的信息&#xff0c;如果我们在解读时没有清晰的思路&#xff0c;忽略重点&#xff0c;就很容易被庞杂的数据搞得晕头转向。本文将从几个关键指标出发&#xff0c;包括资产负债率的分析、净资产收益率的解读&#xff0c;以及如何计算销售复合增长…