对Column Index中的每一列,其存储都使用了无序且追加写的格式。结合标记删除及后台异步compaction实现空间回收。其具体实现上有如下几个关键点:
- 列索引中记录按RowGroup进行组织(目前每个RowGroup包含64K行),每个RowGroup中不同的列会各自打包形成DataPack。
- 每个RowGroup都采用追加写,分属每个列的DataPack也是采用追加写模式。对于一个列索引,只有Active RowGroup负责接受新的写入。当该RowGroup写满之后即冻结,其包含的所有Datapack会转为压缩格保存到磁盘上,同时记录每个数据块的统计信息便于过滤。
- 列存RowGroup中每新写入一行都会分配一个RowID用于定位,属于一行的所有列都可以用该RowID计算定位,同时系统维护PK到RowID的映射索引,以支持后续的删除和修改操作。
- 更新操作采用标记删除的方式,对于删除操作直接设置BitMap即可。对于更新操作,首先根据RowID计算出其原始位置并设置删除标记,然后在ActiveRowGroup中写入新的数据版本。
- 当一个RowGroup中的无效记录超过一定阈值,则会触发后台异步compaction操作,其作用一方面是回收空间,另一方面可以让有效数据存储更加紧凑,提升分析型查询单的效率。

采用这种数据组织方式,一方面满足了分析型查询按列进行批量扫描过滤的要求。另一方面对于TP型事务操作影响非常小,写入操作只需要按列追加写到内存即可,删除操作只需要设置一个删除标记位。而更新操作则是一个标记删除附加一个追加写。列存在支持事务级别更新的同时,几乎不影响OLTP的性能。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




