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两步组合实现。

目录
相关文章
|
4月前
|
存储 SQL 关系型数据库
PolarDB这个sql行存和列存性能差别好大 ,为什么?
PolarDB这个sql行存和列存性能差别好大 ,为什么?
33 0
|
6月前
|
SQL 监控 关系型数据库
PostgreSQL普通表转换成分区表
如何使用pg_rewrite扩展将普遍表转换成分区表
276 0
|
存储 消息中间件 NoSQL
聊一聊数据库的行存与列存
好多人最开始学习数据库的时候,是关系数据库,数据以表格形式存储,一行表示一条记录。其实这种就是典型的行存储(Row-based store),将表按行存储到磁盘分区上。 而一些数据库还支持列存储(Column-based store),它将表按列存储到磁盘分区上。
聊一聊数据库的行存与列存
|
7月前
|
存储 运维 算法
GaussDB 技术解读系列:高级压缩之 OLTP 表压缩
这里我们也做了一个标准的 TPCC 的测试评估,基于 GaussDB 单机版本进行选择性压缩。根据 TPCC 的语义,所有已经配送完成的订单就不会再变更,但仍有一定的概率被访问到,这是非常贴近于真实业务场景的访问模型。所以,我们的压缩算法选择了压缩流水类数据,比如订单数据,而一些状态类的数据,比如库存、账户等没有去压缩,在流水数据里,我们也只压缩已经配送完成的订单,不压缩没有配送完成的订单。从最后的结果看,整个压缩之后对于业务的影响在 1.5% 左右。我们相信我们是业内第一个在 150 万 tpmC 性能峰值仍然能够开启压缩并且性能基本不下降的产品。
72 0
|
9月前
|
存储 算法
GreenPlum AOCO列存如何将数据刷写磁盘
GreenPlum AOCO列存如何将数据刷写磁盘
72 0
|
存储 索引
67.【clickhouse】ClickHouse从入门到放弃-对于分区、索引、标记和压缩数据的协同总结
【clickhouse】ClickHouse从入门到放弃-对于分区、索引、标记和压缩数据的协同总结
67.【clickhouse】ClickHouse从入门到放弃-对于分区、索引、标记和压缩数据的协同总结
|
存储 算法 NoSQL
【数据库系列】什么是列式存储和行式存储
列式存储:每一列单独存放,数据即是索引。只访问涉及得列,如果我们想访问单独一列(比如NAME)会相当迅捷。一行数据包含一个列或者多个列,每个列一单独一个cell来存储数据。行式存储: 把一行数据作为一个整体来存储。学习:https://blog.csdn.net/qq_43543789/article/details/108662140。......
550 0
【数据库系列】什么是列式存储和行式存储
|
存储 SQL NoSQL
PostgreSQL 列存, 混合存储, 列存索引, 向量化存储, 混合索引 - OLTP OLAP OLXP HTAP 混合负载应用
PostgreSQL 列存, 混合存储, 列存索引, 向量化存储, 混合索引 - OLTP OLAP OLXP HTAP 混合负载应用
4635 0

热门文章

最新文章