Greenplum列存压缩表事务机制

简介: 事务隔离级别 我们知道Heap表的事务隔离是通过MVCC实现,但是在列存表没有记录xmin,xmax等多版本信息,仅仅记录了块的元信息以及数据,那么它是如何实现事务隔离的? 仍然借助于Heap表,没创建一个列存表,同时创建一个heap辅助表表,通过select * from pg_appendo

事务隔离级别

我们知道Heap表的事务隔离是通过MVCC实现,但是在列存表没有记录xmin,xmax等多版本信息,仅仅记录了块的元信息以及数据,那么它是如何实现事务隔离的?
仍然借助于Heap表,每创建一个列存表,同时创建一个heap辅助表表,通过select * from pg_appendonly可以看到辅助表的OID(segrelid),这个辅助表几面记录了什么呢?

typedef struct AOCSVPInfoEntry
{
        int64 eof;
        int64 eof_uncompressed;
} AOCSVPInfoEntry;

从这个结构体可以看出来,辅助表记录了当前事务在列存文件中可见的结尾偏移量。如果其他连接插入了数据,列存文件变大了,但是当前事务还是只能看到插入之前的结尾偏移量,多余的数据是看不到的。

如图所示,B事务新增的数据的EOF位置存在Heap表中,而Heap表满足MVCC的,所以A事务看不到B事务中Heap表的变更,继续使用A事务开始的是EOF。

6d16bfce2db5e8e9.png

总之,列存的事务原理是靠辅助Heap表实现的。

崩溃恢复

机器可能宕机、断电等,事务需要回滚,数据可能部分写,对于这些场景Greenplum列存是如何处理的呢?

cancel/kill等引起的正常事务回滚

在Greenplum列存表原理里面我们已经提到,并发导入是靠多个文件实现,也就是说每个Insert连接只会负责一个列文件,假设事务开始的时候文件EOF为EOF_start, 导入后变成EOF_end,如果事务回滚,辅助Heap表里面记录的EOF回滚到事务开始的EOF_start,回滚完成。下次事务导入将会从EOF_start继续增加数据,覆盖EOF_start--EOF_end之间的数据。

数据部分写

Greenplum列存表是不写XLOG的,那么它是如何做到崩溃之后恢复的呢?

  • 每次commit提交强制做fsync,所以只要事务提交,那么磁盘数据就是一致的,崩溃恢复不影响。
  • 新的事务导入数据,强制新增block,不能使用上一个事务的block,即便上一个事务的block还没有写满。这样就不会存在复用上一个事务block写数据时写到一半出问题丢失上个事务block的数据。因此强烈不建议使用每次insert一条方式导入数据,这样会产生的大量的block,每条记录都对一个block,影响扫描性能。
目录
相关文章
|
7月前
|
存储 SQL 关系型数据库
PolarDB这个sql行存和列存性能差别好大 ,为什么?
PolarDB这个sql行存和列存性能差别好大 ,为什么?
150 0
|
5月前
|
SQL 安全 大数据
如何安全的大数据量表在线进行DDL操作
如何安全的大数据量表在线进行DDL操作
70 0
如何安全的大数据量表在线进行DDL操作
|
存储 消息中间件 NoSQL
聊一聊数据库的行存与列存
好多人最开始学习数据库的时候,是关系数据库,数据以表格形式存储,一行表示一条记录。其实这种就是典型的行存储(Row-based store),将表按行存储到磁盘分区上。 而一些数据库还支持列存储(Column-based store),它将表按列存储到磁盘分区上。
聊一聊数据库的行存与列存
|
7月前
|
存储 NoSQL 关系型数据库
RocksDB 事务实现和应用场景
RocksDB 事务实现和应用场景
|
存储 调度 数据库
OceanBase存储引擎高级技术——内存数据落盘策略-合并和转储
OceanBase存储引擎高级技术——内存数据落盘策略-合并和转储
1128 0
|
存储 运维 算法
GaussDB 技术解读系列:高级压缩之 OLTP 表压缩
这里我们也做了一个标准的 TPCC 的测试评估,基于 GaussDB 单机版本进行选择性压缩。根据 TPCC 的语义,所有已经配送完成的订单就不会再变更,但仍有一定的概率被访问到,这是非常贴近于真实业务场景的访问模型。所以,我们的压缩算法选择了压缩流水类数据,比如订单数据,而一些状态类的数据,比如库存、账户等没有去压缩,在流水数据里,我们也只压缩已经配送完成的订单,不压缩没有配送完成的订单。从最后的结果看,整个压缩之后对于业务的影响在 1.5% 左右。我们相信我们是业内第一个在 150 万 tpmC 性能峰值仍然能够开启压缩并且性能基本不下降的产品。
143 0
|
存储 算法
GreenPlum AOCO列存如何将数据刷写磁盘
GreenPlum AOCO列存如何将数据刷写磁盘
123 0
|
消息中间件 canal 缓存
缓存与数据库双写一致性深度分析
零基础上手秒杀系统(一):防止超卖零基础上手秒杀系统(二):令牌桶限流 + 再谈超卖零基础上手秒杀系统(三):抢购接口隐藏 + 单用户限制频率零基础上手秒杀系统(四):缓存数据(数据库与缓存一致性实战)(本篇)零基础上手秒杀系统:消息队列异步处理订单...
425 0
|
SQL 存储 数据库
MonetDB 列存数据库架构初探
### 前言 对于越来越多的分析型场景,例如数据仓库,科学计算等, 经典的数据库DBMS的检索性能颇显乏力。 相反的,最近出现了很多面向列存的数据库DBMS,像ClickHouse,Vertica, MonetDB等,因其充分利用了现代计算机的一些硬件优势,同时舍弃了一些DBMS特性,得到了非常好的检索性能。本文就MonetDB, 整理一些资料和代码,简单介绍其核心设计。 通过简单Benc
5712 0