GreenPlum AOCO列存读IO原理

news2025/7/9 5:56:21

GreenPlum AOCO列存读IO原理

GP自带AOCO列存,它的IO和heap表的IO是分开的。Heap表的脏数据由checkpoint或后台write进程刷写,也就是FlushBuffer函数调用smgrwrite。由magnetic disk storage manager管理IO模块。但是AOCO列存则是由本身进行管理,由函数BufferedAppendWrite完成脏页的刷写。同理,AOCO列存的读也是由本身管理,由函数BufferedReadIo完成加载到内存。本文重点介绍AOCO是如何加载数据页的

1、相关结构体

我们先看下列存扫描涉及的相关结构体及其之间的关系,如下图所示:

99347a3806fad5f3a95925e42f136e53.png

1)函数scan_begin->aocs_beginscan初始化AOCSScanDesc结构,该结构与IO相关的主要是columnScanInfo结构,包含proj_atts即扫描投影列的列号数组;ds数组大小是列的个数,也就是每个投影列为一个成员ds[i],即DatumStreamRead

2)DatumStreamRead描述每个AO列的读相关信息。包含:

(1)maxAoBlockSize表示最大AO块大小,该值大小来自pg_attribute_encoding系统表的option指定的大小。默认是32KB。

(2)buffer_beginp:指向一个block中的value头位置,将其值赋予blockRead的buffer_beginp。指向largeReadMemory某个位置。

acc->buffer_beginp=AppendOnlyStorageRead_GetBuffer(&acc->ao_read)

函数datumstreamread_block_get_ready中将其值给blockRead的buffer_beginp进行管理。

8a455f408722eb6b1b5bc924b61ba7dc.png

可以看出largeReadLen其实就是从磁盘上一次读入buffer的大小。

3)DatumStreamBlockRead:管理一个block中tuple的读取

4)AppendOnlyStorageRead:管理IO

(1)maxBufferLen:一个block大小,请求读的最大大小

(2)largeReadLen:2*maxBufferLen大小

(3)storageAttributes:每一列的属性,比如是否压缩、压缩算法、压缩级别等

(4)bufferedRead:这个是真正管理buffer的

5)BufferedRead:管理IO的buffer,包括

(1)maxBufferLen:1个block大小,请求读的最大大小

(2)maxLargeReadLen:2个block大小,IO的最大请求

(3)memory:总的IO buffer,大小是memoryLen,其实是上述2个值的和,即3个block大小

(4)beforeBufferMemory:memory的前一部分,用于使得block连续

(5)largeReadMemory:IO的内容都是加载到这里的

(6)largeReadPosition:seg文件的已读大小

(7)bufferOffset和bufferLen:bufferLen本次请求读的大小,bufferOffset为在largeReadMemory中的读偏移

2、blockRead中memory的管理

分为两种情况,一种是请求的block页全部在largeReadMemory中,另一种是被截断了,正好在largeReadMemory末尾位置仍旧不是完整的。

2.1 请求的block全部在largeReadMemory

64cb02a6ecbbf5531d8b661d3cafd4c9.png

1)BufferedReadIo一次从磁盘上读入2个页大小的内容到BufferedRead.largeReadMemory中

2)aocs_getnext函数需要从该buffer读取一个tuple:

(1)先读取最小页头(包含crc,但不包含firstRowNum),大小是16字节

e85692a090532f78ca00e9992f513fbd.png

(2)AppendOnlyStorageFormat_GetHeaderInfo函数获取页头信息,AppendOnlyStorageRead.storageAttributes.checksum标记是否开启了checksum

(3)若由firstRowNum,则页头大小需要申请24字节

(4)BufferReadGrowBuffer函数重新读取largeMemoryBuffer,将需要的页头大小扩展到24字节,并从中解析出数据部分大小。storageRead->current.overallBlockLen=页头+数据部分大小

(5)检查checksum

(6)返回value部分,每个value都由value头+数据组成,将这个值作为slot的value指针返回。

(7)实际上TupleSlot的datum值指向的是largeReadMemory内存的某个位置

2.2 请求的block没全部在largeReadMemory

0d3b8630141d325d3e7eaf4188fc5567.png

这种情况发生在重新获取包括firstRowNum或者整个block data的场景中:

1)当请求的大小超出largeReadMemory的时候,也就是需要的数据并没有全部加载进来,此时为了保证一个block连续,将头部内容拷贝到beoreBufferMemory中。当然需要先计算处理剩余多少,从beoreBufferMemory尾部开始放以便和后续的同一个block的内容连续。

2)此时在返回的页头是beoreBufferMemory中的指针,也就是数据是从beforeBufferMemory中开始的。

到此大概就了解了AOCO是如何加载数据的了,希望给大家带来一些启发。

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

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

相关文章

【信息融合】BP神经网络和DS证据理论不确定性信息融合问题【含Matlab源码 2204期】

⛄一、 D-S证据理论及解释 证据理论由Dempster在1967年最初提出,并由他的学生Shafer改进推广使之成为符合有限离散领域中推理的形式,因此称为D-S理论。证据理论讨论一个“辨识框架”(Frame of Discernment)Θ,它是关于命题的相互独立的可能答案或假设的一个有限集合。按传统方…

基于POI的可快速定制Excel导出脚本设想

基于POI的可快速定制Excel导出脚本设想 背景 年关将至,业务人员提出了好多比较着急但是又不常用的取数需求。所谓不常用,大概了是由于业务人员前期调研产生的临时需求,后续也不会大面积铺开,没必要专门分配人员去开发。所谓比较着…

诊断数据库ODX—数据库框架(基于ISO22901详解)

文章目录 前言一、ODX数据库自身架构是什么?二、ODX数据库架构具体组成部分和含义总结前言 车载诊断现阶段应用的诊断数据库大体分为三种: CDD(Vector私有格式); ODX全球通用诊断数据库格式; DEXT&…

【零基础入门SpringMVC】第四期——RESTFUL专题

一、RESTFul 概述 1、什么是 RESTFul? REST 全称 Representational State Transfer 代表 表现层资源状态转移 视图层 控制层 表现层 百度百科这样说: RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式…

轻松应对80% 的工作场景?GitHub 爆赞的 Java 高并发与集合框架,面试官也拿我没辙

在工作中,笔者经常和掌握不同技术的朋友讨论具体问题的解决方案,发现在 Java 体系中,大家使用最多的是 Java 集合框架(JCF)和 Java 并发工具包(JUC)。实际上,JCF 和 JUC 已经能够覆盖…

Flutter高仿微信-第50篇-群聊-查看群成员

Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图: 实现代码: import package:flutter/material.dart; import package:…

Node.js 入门教程 7 从命令行运行 Node.js 脚本 8 如何退出 Node.js 程序

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录,不存在任何商业用途,如侵删 文章目录Node.js 入门教程7 从命令行运行 Node.js 脚本8 如何退出 Node.js 程序7 从命令行运行 Node.js 脚本 运行 Node.js 程序的常用方法是&#…

【点云处理】点云法向量估计及其加速(5)

在上一篇文章【点云处理】点云法向量估计及其加速(4)中我们尝试对pcl自带的KDTree的k近邻搜索过程使用OpenMP加速,效果比较明显,有将近1倍的提速。在这篇文章中我们暂时放弃pcl自带的KDTree,转而使用另一大杀器nanflann库提供的KDTree。nanof…

玩链子游戏

一 游戏描述 有一条链子,上面有 n 颗钻石,钻石编号为 1~n 。可以对该链子执行两种操作: ① CUT a b c (区间切割操作) 切下从第 a 颗钻石到第 b 颗钻石的链子,把它插在剩余链子的第 c 颗钻石…

【食品加工技术】第五章 烘烤食品加工技术 笔记

【食品加工技术】第五章 烘烤食品加工技术 笔记5.1 焙烤食品概述烘烤食品的分类按发酵和膨化程度分类安装生产工艺分类烘烤食品的原料面粉糖蛋品乳及乳制品膨松剂烘烤设备常用设备恒温设备常用工具5.2 面包加工工艺和关键技术面包的分类面包的发酵原理面包的工艺流程一次发酵二…

uboot引导应用程序

uboot默认是支持执行应用程序的,就像引导内核一样,我们也可以自己写一个应用程序,让uboot启动时引导。 在uboot examples/standalone 目录下,有hello_world.c文件,编译uboot的时候,会自动编译hello_world.…

详解 InnoDB Cluster 主机名问题

详解 InnoDB Cluster 主机名问题 文章目录详解 InnoDB Cluster 主机名问题导言测试过程结论导言 因在写 【InnoDB Cluster】修改已有集群实例名称及成员实例选项 时发现主机名这块有一些问题,在其中进行了部分测试,但为使其内容精简,故将此部…

程序员必知的三款在线绘图工具

文章目录2.draw.io3.Lucidchart4.PrcessOn5.小结正所谓“一图胜千言”,无论是商务办公、PPT 演示、学习总结、技术交流、项目开发,我们常常都需要制作一些图表、流程图、架构图来更直观地呈现内容以及归类整理知识点。 今天就来说下程序员们常用的三款在…

【矩阵论】正规方程——生成子空间

5.1 子空间 5.1.1. 定义 设 W⊂CnW\subset C^nW⊂Cn ,即子空间对线性组合封闭 若(1)对∀α,β∈W,有αβ∈W(对加法封闭)(2)对∀α∈W,∀k∈C,有kα∈W(对数乘封闭)\begin{aligned} 若 &(1)对\forall \alpha,\beta\in W,有\…

秋招失利,拿到这份“Java 高分指南(25 专题)”,金三银四翻盘有望

面试造火箭,工作拧螺丝!金九银十灰溜溜地落榜,备受打击。正当准备明年金三银四之际,意外喜提朋友赠送的这“Java 高分指南(25 专题)”:Elasticsearch、微服务、Linux、JavaOOP、集合/泛型、Mysq…

Flutter高仿微信-第57篇-添加好友

Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图: 实现代码: /*** Author : wangning* Email : maoning20080809163.c…

ThreadLocal

文章目录一、ThreadLocal是什么二、ThreadLocal作用三、ThreadLocal的设计结构早期:现在:四、ThreadLocal核心方法1. set方法2. get方法3. remove方法五、ThreadLocal内存泄漏六、使用场景七、参考资料前言: 再写博客时,遇到了如何处理保存用户的信息时出…

基于共享储能电站的工业用户 日前优化经济调度matlab程序(yalmip+cplex)(yalmip+gurobi)

基于共享储能电站的工业用户 日前优化经济调度matlab程序(yalmipcplex)(yalmipgurobi) 参考文献:基于共享储能电站的工业用户 日前优化经济调度 摘要: 文章提出一种基于共享储能电站的工业用户日前优化经济调度方法。…

nginx反向代理,负载均衡配置

文章目录一.nginx代理简介二.nginx配置简介三.nginx作为反向代理的配置四.nginx作为负载均衡的配置五.使用nginx代理的坑一.nginx代理简介 其实nginx作为代理有两种 正向代理: 隐藏客户端的信息;如科学上网 反向代理: 隐藏服务端的信息;如负载均衡 二.nginx配置…