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:

目录
相关文章
|
存储 NoSQL 关系型数据库
|
存储 消息中间件 NoSQL
聊一聊数据库的行存与列存
好多人最开始学习数据库的时候,是关系数据库,数据以表格形式存储,一行表示一条记录。其实这种就是典型的行存储(Row-based store),将表按行存储到磁盘分区上。 而一些数据库还支持列存储(Column-based store),它将表按列存储到磁盘分区上。
聊一聊数据库的行存与列存
|
存储 文件存储 索引
GreenPlum列存解密
GreenPlum列存解密
239 0
|
7月前
|
关系型数据库 OLAP 分布式数据库
PolarDB 开源版通过 duckdb_fdw 支持 parquet 列存数据文件以及高效OLAP
背景PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力.本文将介绍PolarDB 开源版通过duckdb_fdw 支持 parquet 列存...
603 0
|
存储 并行计算 算法
PolarDB 开源版通过 duckdb_fdw 支持 parquet 列存数据文件以及高效OLAP
PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力. 本文将介绍PolarDB 开源版通过duckdb_fdw 支持 parquet 列存数据文件以及高效OLAP.
1712 0
|
存储 算法 NoSQL
【数据库系列】什么是列式存储和行式存储
列式存储:每一列单独存放,数据即是索引。只访问涉及得列,如果我们想访问单独一列(比如NAME)会相当迅捷。一行数据包含一个列或者多个列,每个列一单独一个cell来存储数据。行式存储: 把一行数据作为一个整体来存储。学习:https://blog.csdn.net/qq_43543789/article/details/108662140。......
803 0
【数据库系列】什么是列式存储和行式存储
|
SQL 关系型数据库 PostgreSQL
|
SQL 存储 数据库
MonetDB 列存数据库架构初探
### 前言 对于越来越多的分析型场景,例如数据仓库,科学计算等, 经典的数据库DBMS的检索性能颇显乏力。 相反的,最近出现了很多面向列存的数据库DBMS,像ClickHouse,Vertica, MonetDB等,因其充分利用了现代计算机的一些硬件优势,同时舍弃了一些DBMS特性,得到了非常好的检索性能。本文就MonetDB, 整理一些资料和代码,简单介绍其核心设计。 通过简单Benc
5712 0