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

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

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相关的结构体及其之间关系。如下图所示:

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中

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函数中:

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,一页大小,默认32KB2)largeWriteLen:大小为2*maxBufferLen3)regularHeaderlen:固定页头大小:AoHeader_RegularSize(8字节) + checksum(8字节)4)currentCompleteHeaderLen:完整页头大小:      AppendOnlyStorageWrite_CompleteHeaderLen函数获取该页头完整大小

5)BufferedAppend bufferedAppend:保存写缓冲的数据。6)currentBuffer:指向bufferedAppend.largeWriteMemory的某个位置,表示datum_buffer拷贝写入的位置。BufferedAppend bufferedAppend:写缓冲1)maxLargeWriteLenao_write的largeWriteLen值,也就是2个页大小。即largeWriteMemory大小。2)memory:数据缓冲,3页大小3)largeWriteMemorymemory起始位置开始2页大小,写入的起始位置。4)afterBufferMemory:紧接着memory+2页大小开始1页大小。当largeWriteMemory空闲空间放不下时,放入这里。largeWriteMemory内容刷写后将这块数据拷贝到largeWriteMemory,使之连续。


2、AOCO列存insert操作


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

可以了解:会对每一列都分别进行处理。首先将datum中的内容拷贝到largeWriteMemory,若放不下,则先刷写掉largeWriteMemory内容,然后再进行拷贝。若仍旧空间不够,则触发大字段存储。大字段存储调用AppendOnlyStorageWrite_Content函数进行处理。aocs_insert_values函数中,仅当largeWriteMemory满时才将其中内容刷写到磁盘上,若剩余的一点点,不满呢?什么时会刷写?答案是在函数aocs_insert_finish中进行刷写。调用时机ExecEndPlan->...->aocs_insert_finish:

目录
相关文章
|
人工智能 算法 API
多模态模型卷王诞生!InternVL3:上海AI Lab开源78B多模态大模型,支持图文视频全解析!
上海人工智能实验室开源的InternVL3系列多模态大语言模型,通过原生多模态预训练方法实现文本、图像、视频的统一处理,支持从1B到78B共7种参数规模。
1660 6
多模态模型卷王诞生!InternVL3:上海AI Lab开源78B多模态大模型,支持图文视频全解析!
|
11月前
|
运维 监控 数据可视化
基于 UptimeRobot 的开源站点监控面板——快速上手与部署指南
基于 UptimeRobot API 的站点监控面板,采用 PHP + Material Design 构建,支持 HTTP、Ping、TCP 等多种监控方式,具备多站点管理、数据可视化图表、响应式设计等功能。项目提供 Vercel 一键部署与手动部署两种方式,操作简便,适合快速集成到生产环境。开源地址:https://github.com/miloce/uptime-monitor,欢迎 Star 和反馈!
340 22
基于 UptimeRobot 的开源站点监控面板——快速上手与部署指南
扫描工具 -- Nuclei
扫描工具 -- Nuclei
1797 0
扫描工具 -- Nuclei
|
11月前
|
数据采集 监控 安全
数据治理起步难?Dataphin内置模板来帮你
数据治理冷启动常因沟通协调多、流程长且配置繁琐而受阻。Dataphin 提供多种内置模板,涵盖数据标准码表(如行政区划、度量单位等)、安全分类分级(如金融、能源行业规范)、数据质量规则(40+常用规则)及识别特征(如手机号、身份证号),助力企业快速构建治理框架,提升效率,加速数据战略实施。
359 0
|
Java
java springboot 8080端口号冲突时 修改当前项目端口号
java springboot 8080端口号冲突时 修改当前项目端口号
793 0
|
数据采集 缓存 NoSQL
布隆过滤器原理和使用场景
布隆过滤器(Bloom Filter)是一种高效的空间节省型数据结构,用于判断元素是否存在于集合中。它通过多个哈希函数将元素映射到位数组,查询时检查对应位是否全为1。优点是空间效率高,缺点是有一定误判率。典型应用场景包括缓存穿透防护、垃圾邮件过滤、黑名单管理及去重等。Java实现中使用BitSet和自定义哈希函数,而Guava和Redis也提供了布隆过滤器的实现。
659 0
|
Java 关系型数据库 MySQL
②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
351 0
|
人工智能 自然语言处理 搜索推荐
Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等功能
Open Notebook 是一款开源的 AI 笔记工具,支持多格式笔记管理,并能自动将笔记转换为博客或播客,适用于学术研究、教育、企业知识管理等多个场景。
2128 0
Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等功能
|
安全 Ubuntu Linux
Linux系统无法启动或启动过程中卡住
【10月更文挑战第5天】
2597 3
|
JSON 数据格式
“JSON parse error: Unexpected character (‘1‘ (code 49))的解决方式
“JSON parse error: Unexpected character (‘1‘ (code 49))的解决方式