GreenPlum AOCO列存如何将数据刷写磁盘

news2024/11/11 4:43:52

GreenPlum AOCO列存如何将数据刷写磁盘

AOCO列存表每个字段一个文件,前面我们介绍了列存表如何加载数据页,本文我们重点介绍AOCO表如何进行刷写。AOCO表进行insert、update、delete会产生脏数据,和heap表的异步脏页刷写不同,AOCO表的数据时同步刷写的。也就是在AOCO表向datum_buffer放入数据后,立即将其从datum_buffer写入largeWriteMemory,最后将数据从largeWriteMemory写入磁盘。

Delete不会导致AOCO列存表段文件的刷写,update本质上是delete + insert操作,所以我们这里仅关注insert。

1、AOCO写相关结构体

我们先看下insert相关的结构体及其之间关系。如下图所示:

71f998ef29deef9d1946507d08b17c18.png

1)ExecInsert->aocs_insert对AOCO表进行插入,入参有AOCSInsertDesc(为AOCO列存插入服务)和TupleTableSlot(存有需要插入的tuple)。我们重点关注AOCSInsertDesc结构体

2)Relation aoi_rel存有表的相关元数据,包括pg_class系统表等。

3)char *compType为压缩算法

4)compLevel为压缩级别。和3)的值一起来自pg_appendonly系统表。

5)使用时使用pg_attribute_encoding系统表,初始化到DatumStreamWrite中

57bd4f949cec2b5482e1776c5e7de74b.png

6)最主要的就是DatumStreamWrite结构,ds数组描述所有字段。

下面我们看下DatumStreamWrite结构

1)maxAoBlockSize为页大小,来自pg_attribute_encoding系统表的options中。

2)maxAoHeaderSize:列存页的header大小,分为Original和Dense*类型。Original类型:AoHeader_RegularSize(8)+ crc(8) + firstRowNum(8);Dense*:AoHeader_LongSize(16) + crc(8) + firstRowNum(8)

create_datumstreamwrite函数中:

5e44b066fd9f30b3c95d61610713a124.png

3)AppendOnlyStorageAttributes ao_attr:存储层的属性值,包括压缩相关信息等,由函数create_datumstreamwrite->init_datumstream_info进行初始化,这些值就来自pg_attribute_encoding了。

4)AppendOnlyStroageWrite ao_write:将blockWrite中的数据写入ao_write中,此时需要初始化页头,然后将其刷些磁盘

5)DatumStreamBlockWrite blockWrite:临时存储页数据,不包括页头。

这里重点介绍ao_write和blockWrite。先看下blockWrite:

1)maxDataBlockSize:数据部分最大大小。

2)datum_buffer:用于存储数据,大小为datum_buffer_size。

3)datump:指向datum_buffer中的空闲空间

ao_write为真正刷写数据的缓冲:

1)maxBufferLen:来自DatumStreamWrite的maxAoBlockSize,一页大小,默认32KB

2)largeWriteLen:大小为2*maxBufferLen

3)regularHeaderlen:固定页头大小:AoHeader_RegularSize(8字节) + checksum(8字节)

4)currentCompleteHeaderLen:完整页头大小:

      AppendOnlyStorageWrite_CompleteHeaderLen函数获取该页头完整大小

ff88f39af6584ff2f1aabaa4d4d3cedc.png

5)BufferedAppend bufferedAppend:保存写缓冲的数据。

6)currentBuffer:指向bufferedAppend.largeWriteMemory的某个位置,表示datum_buffer拷贝写入的位置。

BufferedAppend bufferedAppend:写缓冲

1)maxLargeWriteLen:ao_write的largeWriteLen值,也就是2个页大小。即largeWriteMemory大小。

2)memory:数据缓冲,3页大小

3)largeWriteMemory:memory起始位置开始2页大小,写入的起始位置。

4)afterBufferMemory:紧接着memory+2页大小开始1页大小。当largeWriteMemory空闲空间放不下时,放入这里。largeWriteMemory内容刷写后将这块数据拷贝到largeWriteMemory,使之连续。

2、AOCO列存insert操作

Insert操作的入口函数是aocs_insert:aocs_insert->aocs_insert_values:其主要流程如下图所示:

090eaf69663d1db2a9686d901263ccdd.png

可以了解:会对每一列都分别进行处理。首先将datum中的内容拷贝到largeWriteMemory,若放不下,则先刷写掉largeWriteMemory内容,然后再进行拷贝。若仍旧空间不够,则触发大字段存储。大字段存储调用AppendOnlyStorageWrite_Content函数进行处理。

aocs_insert_values函数中,仅当largeWriteMemory满时才将其中内容刷写到磁盘上,若剩余的一点点,不满呢?什么时会刷写?答案是在函数aocs_insert_finish中进行刷写。调用时机ExecEndPlan->...->aocs_insert_finish:

8b9af4a3e6b4f67e726fed33fab1daa6.png

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

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

相关文章

写一个锅炉温控系统用python编写

简单来说就是锅炉水热了之后循环泵自动开启,然后将热水输送走,送到暖气,热水抽走,凉水进入锅炉,温度降低,循环泵关闭,等待下一次水烧热。因为需要取暖的房子距离烧锅炉的地方比较远,所以需要循环泵,如果距离近的话水烧热后利用热水上流冷水回流的原理会自动完成循环。…

前言技术之mybatis-plus

目录 1.什么是mybatis-plus 2.初体验 3.日志 4.主键生成策略 5.更新 6.自动填充 1.什么是mybatis-plus 升级版的mybatis,目的是让mybatis更易于使用, 用官方的话说“为简化而生” 官网: MyBatis-Plus 2.初体验 1.准备数据库脚本 数据…

BI 解决方案:BimlStudio 22.3.0 Crack

全功能开发环境:::: 导入现有解决方案 通过添加 BimlScript 自动化进行更改并重新生成包;使您的解决方案更好、更快。 可视化整个 BI 解决方案 通过我们的可视化设计器在一个位置进行更改,观察您的整个解决方案自行更新…

【ArcGIS微课1000例】0061:ArcGIS打开xyz格式点云数据的方法

本文讲述ArcMap和ArcScene中如何打开xyz格式的点云数据并做可视化的方法。 文章目录 一、xyz格式点云简介二、ArcMap打开xyz点云三、ArcScene打开xyz点云四、注意事项一、xyz格式点云简介 本实验使用的数据是配套数据包中的0061.rar,斯坦福大学的点云数据,格式为X,Y,Z,如下…

【My Electronic Notes系列——晶闸管】

目录 序言: 🏮🏮新年的钟声响,新年的脚步迈,祝新年的钟声,敲响你心中快乐的音符,幸运与平安,如春天的脚步紧紧相随,春节快乐!春华秋实,我永远与你…

Linux下动静态库的打包与使用C C++

目录前言为什么用动静态库动态链接与静态链接底层优缺点Linux下的动静态库动静态库的对比打包静态库使用静态库打包动态库使用动态库小结win下打包动静态库前言 为什么用动静态库 我们在实际开发中,经常要使用别人已经实现好的功能,这是为了开发效率和…

移动窗口下的LiDAR点云区域生长滤波算法教程

一、前言LiDAR 滤波的现有方法包括:数学形态学滤波法、基于地形坡度滤波、最小二乘内插法滤波等滤波方法。最小二乘内插法能够较好的获取地形趋势面,但是算法中无法根据地形自适应设置参数;在地形起伏较大的地区提取结果精度低;无…

Linux进程的后台运行

文章目录一. 什么是进程?二. 进程后台运行在了解三种进程后台运行的方式前,小编觉得有必要先简单讲解一下什么是进程。 PS: 本篇博客技术参考价值不大,只是类似随笔比较水,详细的知识点可以关注一下nohup命令的使用。 一. 什么是进程? 什…

00开篇词:带你玩转gRPC框架

前言 大家好,先做一下自我介绍 我叫Barry Yan,目前是一名互联网公司的研发工程师,同时也是后端技术领域的狂热爱好者和技术博主,在GitHub、CSDN社区、51CTO博客社区、阿里云技术社区、掘金技术社区和InfoQ写作社区等都有自己的博…

详解1242:网线主管(二分答案经典习题)

题目1242:网线主管时间限制: 1000 ms 内存限制: 65536 KB提交数: 23180 通过数: 5566【题目描述】仙境的居民们决定举办一场程序设计区域赛。裁判委员会完全由自愿组成,他们承诺要组织一次史上最公正的比赛。他们决定将选手的电脑用星形拓扑结构连接在一…

【SVM原理推导】核SVM为什么能分类非线性问题?

核SVM为什么能分类非线性问题?要解决这个问题,首先应该先深入理解SVM的原理与本质。(涉及SVM的问题是很常见的,因为SVM可以算是传统机器学习领域非常成功的算法之一了,现在仍有许多research运用SVM解决问题。) 一、支持向量机(SVM) 1. 基本介绍与提出背景 支持向量机…

【C++】lambda 表达式 | 包装器

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉lambda表…

解决宏碁非凡S3 安装Win11时无法找到驱动器问题

1 问题描述 机型:宏碁非凡S3 2022款CPU:i5 1240P安装系统:Win11 专业版问题描述:安装系统时,在选择驱动器界面无法找到驱动器,如下图所示 2 解决流程 查了一下网上的解决办法,进入BIOS把VMD C…

非极大值抑制(Non-Maximum Suppression)

文章目录一、什么是非极大值抑制二、为什么要用非极大值抑制三、 如何使用非极大值抑制四、代码段一、什么是非极大值抑制 非极大值抑制,简称为NMS算法,英文为Non-Maximum Suppression。其思想是搜素局部最大值,抑制非极大值。NMS算法在不同…

JavaEE7-Bean的作用域

目录 1.作用域定义 2.Bean的6种作用域 2.1.singleton:单例作用域(默认作用域) 2.2.prototype:原型作用域(多例作用域) 2.3.request:请求作用域 2.4.session:会话作用域 2.5.a…

C++基础回顾

吼吼吼CC基础回顾C基础入门一、标识符1.1标识符命名规则二、数据类型2.1整形(格式:int 关键字)2.2 sizeof关键字2.3 float关键字2.4字符型2.5转义字符2.6字符串型2.7布尔类型2.8数据的输入三、运算符3.1算数运算符前置递增与后置递增区别3.2 …

MS Access数据库多数据源JDBC查询

Druid, C3P0都不支持微软的Access,如何实现多数据源JDBC查询?? 2023-01-23T23:54:52.4760800 WARNING com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask544a5904 -- Acquisition Attempt Failed!!! Clearing pending a…

Linux内核驱动初探(二) TI声卡

目录 0. 前言 1. menuconfig 2. 超时问题 3. 稳定性问题 0. 前言 通过查询该设备原理图可知,该声卡的Codec芯片型号为德州仪器 TLV320DAC3101。 1. menuconfig 我们在 linux-menuconfig 里面如下设置:进入 Device Drivers ---> Sound card supp…

准确率、精确率、召回率、F1-measure

文章目录准确率(Accuracy)精确率(precision)召回率(recall)F1-measure值学习理解网站-p’(Predicted)n’(Predicted)p(Actual)True PositiveFalse Negtiven(Actual)False PositiveTrue Negtive 准确率(Accuracy) ANo.Samples Predicted CorrectlyTotal No.of SamplesTPTNPN(1)A…

适配splashscreen步骤以及遇到的坑

Android 12 启动画面 从 Android 12 开始,在所有应用的冷启动和温启动期间,系统一律会应用 Android 系统的默认启动画面。默认情况下,此系统默认启动画面由应用的启动器图标元素和主题的 windowBackground(如果是单色&#xff09…