GreenPlum列存解密

news/2024/5/4 5:08:56/文章来源:https://blog.csdn.net/yanzongshuai/article/details/126984132

GreenPlum支持列式存储。叫做AOCO表。那么AOCO列存是如何管理列存文件?如何实现MVCC?是否支持索引,若支持如何实现的呢?下面我们介绍下AOCO的实现机制。

1、存储结构

0517527123482e4a5bd9a1678cac0295.png

如上图所示,列存每一列单独存储一个文件。上面一个表有4个字段,那么对应分别存储在relfilenode.1,relfilenode.129,relfilenode.257,relfilenode.385文件中。其中relfilenode为该表的文件OID,若没进行过truncate、vacuum等操作,和表的OID相同。该值可以从pg_class系统表中查询到。上述文件,存储在segment上,master节点仅存储与数据无关的元数据信息。

列存文件里也是以block为单位,一个block最大值的范围是8KB--2MB(默认32KB)。创建表时可以指定:

create table t(id1 int,id2 int,id3 int) with  (appendonly=true, orientation = column, blocksize=65536) distributed by(id1);

也可以在列上指定,此时列上的限制会覆盖with中的限制:

create table t(id1 int encoding (blocksize = 65536),id2 int,id3 int
)with(appendonly=true,orientation=column,blocksize=65536) distributed by(id1);

2、并发

AOCO列存一列独立存储,每列最多128个文件,不同列值不会同时存储到同一个文件。比如并发操作第一列时,会话1使用filenode.1,会话2使用filenode.2。当会话1和会话2都结束后,再进行插入时,会轮流项filenode.1和filenode.2中插入,保持2个文件均衡。

当存在单列多个文件时,查询按照文件依次扫描,不会按照插入的顺序输出。

3、可见性

列存的可见性信息没有和列值存在一起,而是由一个辅助表管理。该辅助表为pg_aovisimap_OID,其中OID为表的OID。创建列存表后,会自动创建该表,另外还会自动创建辅助表的索引表pg_aovisimap_OID_index。pg_aovisimap_OID表有3个字段:

1)segno:文件ID,从1开始,并发使用

2)first_row_no:可见性map表开始的行号

3)visimap:bitmap,存储可见性信息

新创建的表,没有进行过更新、删除。那么pg_aovisimap_OID表里面没有数据,对应文件为空。当进行了更新或删除后,才会有数据。并且,仅存储被操作过的数据的可见性,以及和被操作数据在一个map内的行的可见性。一般情况下,32768行作为一个单位,存储在一个bitmap。没有被操作过,且不和其他操作过的在一个map里的行,其可见性不会体现在这个bitmap中,因为他就是可见的。

4、rownum

对于heap表,tupleid决定了每个记录的位置(记录在文件中的偏移)。AOCO表因为数据是压缩的,无法确定在文件中的偏移,因此引入了rownum。每个记录都有一个rownum且单调递增。通过和segno一起存储在AOTupleId中。AOTupleId和heap的ItemPointer结构用的是一个:

typedef struct ItemPointerData
{BlockIdData ip_blkid;//块号OffsetNumber ip_posid;//块内偏移
}
typedef struct BlockIdData
{uint16    bi_hi;uint16    bi_lo;
} BlockIdData;
typedef uint16 OffsetNumber;

所以ItemPointerData是3个uint16的空间。而AOTupleId:

typedef struct AOTupleId
{uint16    bytes_0_1;uint16    bytes_2_3;uint16    bytes_4_5;
} AOTupleId;

其0-6位存储segno;紧接着7-15及bytes_2_3和bytes_4_5的低15位一起来表示rownum。

5、MVCC

列存文件中不包含MVCC信息(xmin,xmax)。为实现MVCC,又引入一个辅助表pg_aoseg_OID。该表的vpinfo中存有重要信息,eof为实际情况下结束位置。辅助表是heap表,MVCC其实通过heap表的MVCC机制加上eof来实现。

6、索引

列存支持索引,但是非唯一索引。索引也是通过一个辅助表来完成。创建索引后会自动创建pg_aoblkdir_OID表及其索引pg_aoblkdir_OID_index。pg_aoblkdir_OID中有字段:

segno:文件号

1)columngroup_no:列号

2)first_row_no:行号

3)minipage:存储每个block的偏移。用于快速定位到列存文件中数据的位置。

注:

上述引入的辅助表都在pg_aoseg下。

7、总结

438dc04cce683384044f864455e6df0b.png

1、pg_aoseg_oid存储列存文件的结束信息,从而结合heap表的MVCC来实现列存的MVCC和事务隔离。

2、pg_aoblkdir_oid创建索引的时候生成,根据rownum行号查找数据block的偏移。列存的索引其实仍旧是btree。通过btree根据key找到其segno+rownum。然后通过segno+rownum从该辅助表找到位于哪个minipage,定位到minipage后,从里面找rownum对应的block号及偏移。

3、保持列数据的可见性,也是根据rownum来定位位于哪个vismap区,然后再从该bitmap中查看对应的位是否为1。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件管理命令和find命令

文件管理命令和find命令 stat命令 查看文件状态 每个文件有三个时间戳: access time访问时间,atime,读取文件内容modify time修性时间, mtime,改变文件内容change time改变时间,ctime,元数据发生改变场景是:上传了WebShell,避…

MySQL数据误删恢复操作

目录记录一次不小心删除生产数据偷偷恢复解决方案 模拟数据删除 记录下操作时间,2022-09-21下午5点左右 通过show variables like %datadir%查看binlog存放目录目录 通过show master status;查看当前binlog的记录文件 查看mysqlbinlog工具目录,需要通过此…

ANYCUBIC Photon Mono 4K光固化打印机快速上手(多次试错的经验积累)

变更记录 记录每次修订的内容,方便追溯。 版本号作者修订内容发布日期1.1Zeeland优化打印机的最佳模式内容2022年9月21日 23:41:581.0Zeeland完善基本文档2022年2月14日 19:33:52 1. 简介 笔者前期使用ANYCUBIC Photon Mono 4K光固化打印机失败了很多次&#xff0c…

Vue3——压缩字体font-spider,完美解决字体压缩后会出现字体消失现象

Vue项目打包字体完整版教程 如果打包的时候字体太大,可以选择压缩字体进行处理 打包前: 打包后: 可以看到,区别还是很明显的,下面是使用方法 这里可以使用字蛛font-spider来进行压缩 字蛛font-spider npm install font-spide…

C 语言避坑指南

文章目录👉引言💎C 避坑指南一、基础|基本常识类1 运算符类型2 占位符|格式化问题3 输入输出问题二、错题 | 程序语句类三、进阶 | 指针与函数四、进阶 | 结构体及宏定义👉引言💎 学习的最大理由是想摆脱平庸,早一天就…

linux 中 date +%s 获取1970年以来的秒数

001、(base) [root@PC1 home]# date +%s 1663810406 (base) [root@PC1 home]# date +%s 1663810410 date +%s //从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数(时间戳)参考:https://zhidao.baidu.com/question/490735500497375812.html

EasyCVR接入宇视设备后通道显示的是目录,是什么原因?

EasyCVR平台基于云边端一体化架构,充分发挥视频接入、汇聚与管理、分发、智能分析、数据共享等能力,不断在多样化场景中落地应用,不仅涵盖传统行业的安防视频监控,还涉及到景区旅游、校园教育、社区、楼宇、智慧农业等领域的应用。感兴趣的用户可以前往演示平台进行体验或部…

Docker安装Jenkins

Docker安装Jenkins 准备工作 下载Jenkins镜像 docker pull jenkins/jenkins开始安装 创建需要挂载的本地文件夹 mkdir -p 路径/jenkens chmod 777 路径/jenkens创建并启动Container docker run -d -p 8080:8080 --name=jenkins -v 路径/jenkens/:/var/jenkins_home jenkins/jen…

vue 中利用js完成等比例缩放图片和点位跟着移动

需要等比例缩放的内容 html <div class="boxImg" ref="cont" style="position: absolute; top: 0; left: 0"><!-- 这里放上需要等比例缩放的内容 --> </div> 在vue中 methods 中写 methods: {updateScaleRatio(ImgObj, ma…

linux - 搭建部署ftp服务器

ftp 服务&#xff1a; 实现ftp功能的一个服务&#xff0c;安装vsftpd软件搭建一台ftp服务器 ftp协议&#xff1a; 文件传输协议 &#xff08;file transfer protocol&#xff09;&#xff0c;在不同的机器之间实现文件传输功能&#xff0c; 例如 视频文件下载&#xff0c;…

前端之html和css(2)

目录 一&#xff0c;html 1&#xff0c;文本相关标签 2&#xff0c;列表标签 3&#xff0c;图片标签 4&#xff0c;超链接 5&#xff0c;表格标签 table 6&#xff0c;表单 form 7&#xff0c;分区标签 二&#xff0c;css层叠样式表 1&#xff0c;css样式代码的三种引入…

【职场必备知识】一文搞懂五险一金(打工人必备)

社保局电话&#xff1a;12333五险一金非常重要的是&#xff1a;缴纳基数和缴纳比例&#xff01; 文章目录五险一金是什么五险一金缴纳比例养老保险养老保险构成退休年龄医疗保险生育险工伤保险失业险公积金补充&#xff1a;常见问题“五险二金”多出来的“一金”是什么&#xf…

Firewall Analyzer防火墙管理

企业防火墙管理 典型的企业网络安全基础设施包括传统防火墙、下一代防火墙 (NGFW)、虚拟专用网络 (VPN) 和来自多个供应商的代理服务器。网络安全管理&#xff0c;特别是防火墙安全管理尤其棘手&#xff0c;因为每个供应商的能力和技术差异很大。然而&#xff0c;市场上有许多…

kubernetes-Service服务发现

目录 一、Service基本概念 1、Pod的特征 1. Pod等资源的概念 2.解决pod进行如此多变化时的解决方案 2、Service 1. Kubernetes Service 定义了这样一种抽象&#xff1a; 2. Service的实现类型 3、Service模型 4、Endpoint Controller 5、Kube-proxy iptables 6、Kube…

ESP8266-Arduino编程实例-OLED-SSD1306(I2C)显示屏驱动

OLED-SSD1306(I2C)显示屏驱动 1、OLED介绍 OLED显示屏是指有机电激发光二极管(OrganicLight-EmittingDiode,OLED)由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一…

MSSQL注入 — 反弹注入

注意&#xff1a;仅用于本人学习的笔记记录&#xff0c;禁止进行传播分享&#xff0c;一旦造成严重后果与本人无关&#xff01;&#xff01;&#xff01; 一、MSSQL反弹注入使用场景 MSSQL>SQL Server MSSQL注入&#xff1a; 反弹注入>注入手法比较偏门(oob) 把查询…

《代码随想录》一刷记录

文章目录前言二、程序的性能分析时间复杂度分析递归算法的时间复杂度分析编程语言的内存管理内存对齐空间复杂度分析递归算法的空间复杂度分析以空间换时间是常见的优化思路三、数组二分查找移除元素长度最小的子数组螺旋矩阵四、链表链表的定义移除链表元素链表常见的操作反转…

GBase8s 汉字转拼音函数

一、GetHzFullPY 函数 GetHzFullPY 函数将汉字转换为全拼。 函数返回值为字符型。使用时&#xff0c;除汉字按顺序转换为全拼外&#xff0c;其余字符&#xff08;包括数字&#xff09;都不进行转换&#xff0c;保留原值。转换完的拼音字符串缺省为小写。 例如&#xff0c;假定 …

计算机毕设源代码网站基于SSM个人财务|记账|账单收入支出统计管理系统

&#x1f345;文末获取联系&#x1f345; 一、项目介绍 计算机毕业设计java毕设项目之SSM个人财务收入支出统计管理系统_哔哩哔哩_bilibili计算机毕业设计java毕设项目之SSM个人财务收入支出统计管理系统共计2条视频&#xff0c;包括&#xff1a;B156 257-SSM个人财务收入支出…

【爬虫知识】2022年python最新前沿技术?通过pyscript写爬虫程序

引言 昨天&#xff0c;有一个粉丝和我说&#xff0c;“仙草哥哥&#xff0c;你现在写的这些文章使用的技术都太旧了。现在的最前沿&#xff0c;最热门的python技术是pyscript&#xff0c;你应该使用一下这个&#xff01;“ 我很好奇&#xff0c;”真的吗&#xff1f;现在pysc…