Greenplum列存压缩表原理

简介:

用法

create table testao(id int, name text) with  (APPENDONLY=true, ORIENTATION=column, COMPRESSTYPE=zlib, COMPRESSLEVEL=5, BLOCKSIZE=1048576, OIDS=false)

APPENDONLY=true, ORIENTATION=column这两个属性决定了这是列存压缩表。

COMPRESSTYPE: 压缩方式,支持zlip,RTE等

COMPRESSLEVEL: 压缩级别,0-9

BLOCKSIZE: 块大小8kB-2MB

优势

  1. 节约成本,列存压缩表空间占用远小于普通的heap表空间
  2. 对查询涉及的列很少时候,无需去读其他列的数据,减少IO
  3. 追加写速度快

存储结构

总体方法是一个文件只存一个列的值,一个文件由多个block组成。

  1. 组成结构

每个列占用一个至多个文件,最多128个,不同列的值不会同时出现一个文件。之所以这么设计,是为了解决并发问题。

b936cde04e6f6721.png

  1. block结构
struct getBlockInfo
{
  int32        contentLen;
  int            execBlockKind;
  int64        firstRow;    /* is expected to be -1 for pre-4.0 blocks */
  int            rowCnt;
  bool        isLarge;
  bool        isCompressed;
  }            getBlockInfo;

BLOCKSIZE大小是8kB-2MB,由压缩前的数据大小决定,压缩后的block大小不一,其中block header不参与压缩。如果插入的值超过blocksize,那么数据将会拆成多个block;对于NULL值,block中使用bit位表示。

99d721584c83b863.png

  1. RowNum机制

对于heap表,由tupleid决定每条记录的位置(tupleid包含记录在文件中偏移位置),而对于AO表,数据是压缩的,没法确定value在文件中偏移位置,因此引用了rownum,每条记录都有自己的rownum,rownum一直增长,rownum可能不连续,但是没关系,我们的block中记录了起始rownum以及block在文件中偏移位置,所以只要给我们一个rownum,我们就能定位到它所在的block,然后从block中就可以遍历到这个rownum对应的记录。

每次insert都会更新rownum,为了解决频繁更新问题,每次申请100个rownum,批量insert时每100个才会更新rownum。通过select * from gp_fastsequence可以查看已使用的rownum。

并发insert原理

当多个Session同时向表中insert数据时,如果只有一个文件,那么每次追加都需要对文件加锁,显然会降低插入性能,为了解决这个问题,当有并发insert时,每个session向各自对应的文件insert数据。不过最大的并发是128,单个列不能超过128个文件限制。

3d496d92b4fb7ab3.png

update/delete实现

delete和update不会在数据文件中直接更新或者删除,而是使用一张heap辅助表visimap,包含一个bitmap列,通过select * from pg_appendonly可以查看到,对任何一个数据的删除直接在bitmap中标记一下即可。update是delete和insert两步组合实现。

目录
相关文章
|
存储 NoSQL 关系型数据库
|
存储 消息中间件 NoSQL
聊一聊数据库的行存与列存
好多人最开始学习数据库的时候,是关系数据库,数据以表格形式存储,一行表示一条记录。其实这种就是典型的行存储(Row-based store),将表按行存储到磁盘分区上。 而一些数据库还支持列存储(Column-based store),它将表按列存储到磁盘分区上。
聊一聊数据库的行存与列存
|
存储 运维 算法
GaussDB 技术解读系列:高级压缩之 OLTP 表压缩
这里我们也做了一个标准的 TPCC 的测试评估,基于 GaussDB 单机版本进行选择性压缩。根据 TPCC 的语义,所有已经配送完成的订单就不会再变更,但仍有一定的概率被访问到,这是非常贴近于真实业务场景的访问模型。所以,我们的压缩算法选择了压缩流水类数据,比如订单数据,而一些状态类的数据,比如库存、账户等没有去压缩,在流水数据里,我们也只压缩已经配送完成的订单,不压缩没有配送完成的订单。从最后的结果看,整个压缩之后对于业务的影响在 1.5% 左右。我们相信我们是业内第一个在 150 万 tpmC 性能峰值仍然能够开启压缩并且性能基本不下降的产品。
140 0
|
存储 算法
GreenPlum AOCO列存如何将数据刷写磁盘
GreenPlum AOCO列存如何将数据刷写磁盘
122 0
|
存储 索引
67.【clickhouse】ClickHouse从入门到放弃-对于分区、索引、标记和压缩数据的协同总结
【clickhouse】ClickHouse从入门到放弃-对于分区、索引、标记和压缩数据的协同总结
67.【clickhouse】ClickHouse从入门到放弃-对于分区、索引、标记和压缩数据的协同总结
|
存储 并行计算 Cloud Native
PolarDB 开源版通过 brin 实现千分之一的存储空间, 高效率检索时序数据
PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的 价值产出, 将数据变成生产力. 本文将介绍PolarDB 开源版通过 brin 实现千分之一的存储空间, 高效率检索时序数据
211 0
|
6月前
|
关系型数据库 分布式数据库 PolarDB
PolarDB 开源版通过 brin 实现千分之一的存储空间, 高效率检索时序数据
背景PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的 价值产出, 将数据变成生产力.本文将介绍PolarDB 开源版通过 brin 实现千分之一的存储空间, 高效率检...
133 0
|
存储 监控 分布式数据库
解密OpenTSDB的表存储优化
本篇文章会详细讲解OpenTSDB的表结构设计,在理解它的表结构设计的同时,分析其采取该设计的深层次原因以及优缺点。它的表结构设计完全贴合HBase的存储模型,而表格存储(TableStore、原OTS)与HBase有类似的存储模型,理解透OpenTSDB的表结构设计后,我们也能够对这类数据库的存储
28176 0
下一篇
无影云桌面