专栏首页Apache IoTDB站在行式存储的肩膀上实现列式存储

站在行式存储的肩膀上实现列式存储

之前简单介绍了一下列式存储和其起源:和谐号为啥快?因为铁轨是列式存储!列式存储的起源:DSM 。在人们发现了列式存储的优点之后,就开始设计列存系统了。这些系统基本都是从头设计实现的。但是牛顿说过,要站在巨人的肩膀上。那么能不能在一个传统关系数据库基础上应用列式存储的思想,让其达到列式存储的效果呢?

参考《Column-Stores vs. Row-Stores: How Different Are They Really?》

从行式存储系统中利用底层列式存储,其实是在探究一个问题,那就是列式存储格式的增益大(磁盘I/O占主导因素),还是在其之上构建的写入和查询引擎带来的增益大。

接下来介绍几种设计方案,以下都针对一个表来说。

列式分区

这其实就是 DSM 。将原始表中的每个列都单独存一张表,并配上一个递增的0、1、2、3的列 index 用来将不同列对齐。

比如原来表有 a,b,c 三列,现在建立三个表,分别为(index,a),(index,b),(index,c)。

在纯种的列存系统中,可以通过各个列中数据的下标来拼接数据,但是传统数据库里可没这个东西,表之间的拼接是通过 join 实现的,所以必须加上一列以便拼接数据。 但是,这样做有个缺点,每一列其实都是两行数据,不能称为严格意义上的列式存储,只能尽量使每一行的数据量最少。

多物化视图

搞一堆物化视图,物化视图可以看成一个物理表,表结构可以定义,数据可以自己填充,一般是将一个查询的结果存成一个表。在这里的处理方法是:针对每个查询,都有一个刚好包含其需要的列的物化视图相对应。

这种方式其实是第一种完全列式和完全行式的折中版。针对每个查询,去掉了那些没用的列,在剩下的表中进行行式查询。可以预见,这种方式比单个表查询要快。但是,这种方式极其占用空间,仅仅是一个实验品。

各列索引

表还是一个表,但是在行式存储模型上构建了一层虚拟的列式存储索引。

具体方法是:为表中的主键和每一列分别建立索引,如B+tree。当接收到针对某一列的过滤条件时,先在各列索引上过滤找出对应的主键,最后合并主键。这里的主键就充当了 index 的功能,用来对齐数据。

这种方式其实是在物理上的行式存储基础上实现了逻辑上的列式存储。

对比

除第二种方式比传统的关系数据库性能好(那是肯定的,每个物化视图都对一种查询进行了优化,剪掉了不需要的列),第一种和第三种都比传统关系数据库差。在一种商用关系型数据库上的测试结果如下图:

其中T是传统关系数据库,T(B)是应用bitmap位图索引辅助查询计划生成(可以忽略这列),MV是多个物化视图的,VP是列式分区,AI是各列索引。因为各个列上操作索引,单个对象的负担比较重,所以VP和AI都比传统的关系数据库还慢。

总结

人出生是不带任何属性与偏好的,但是系统不是,从系统面向场景确定的那一刻,系统就具有了强烈的针对这些场景的优势。在原来的系统上搭建引擎相对省时省力,但是很多时候,天生的就是比后天的要好。

本文分享自微信公众号 - IoTDB漫游指南(Apache-IoTDB),作者:铁头乔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 和谐号为啥快?因为铁轨是列式存储!

    今天不讲和谐号,今天讲列式存储!列式存储是大数据时代的一个特色。每次一听用到了列式存储,就觉得,嗯,肯定nb了。今天我们就来把列式存储的衣服扒了!咳咳,,,揭开...

    Apache IoTDB
  • Apache IoTDB 0.8.1 发布啦!

    我又回来啦!这段时间 IoTDB 发布了两个版本,0.8.0 和 0.8.1,其中 0.8.1 是一个bug修复版。今天主要带大家上手使用 IoTDB,清华自研...

    Apache IoTDB
  • Vertica:C-Store 七年之痒

    介绍论文《The Vertica Analytic Database: C-Store 7 Years Later》,配图是官网找的,这句话挺好:目标从第一行代...

    Apache IoTDB
  • 和谐号为啥快?因为铁轨是列式存储!

    今天不讲和谐号,今天讲列式存储!列式存储是大数据时代的一个特色。每次一听用到了列式存储,就觉得,嗯,肯定nb了。今天我们就来把列式存储的衣服扒了!咳咳,,,揭开...

    Apache IoTDB
  • Go 每日一库之 sqlc

    在 Go 语言中编写数据库操作代码真的非常痛苦!database/sql标准库提供的都是比较底层的接口。我们需要编写大量重复的代码。大量的模板代码不仅写起来烦,...

    用户7731323
  • 教你看懂火绒的报毒名 神奇的知识又增加了嗷

    安全软件的报毒想必大家都见过,点击清除病毒后,也会有点担心和疑问:我中了什么毒,这毒有啥危害?想看一眼报毒界面吧,又是一脸茫然。今天,带工程狮于老师就领大家认识...

    用户6477171
  • Android.mk文件中添加第三方jar文件的方法

    下面给大家介绍Android.mk文件中添加第三方jar文件的方法,具体内容详情如下所示:

    砸漏
  • Java工程中添加依赖jar包不起作用问题总结

    Java工程中添加依赖jar包不起作用问题总结 此次总结两种方式的依赖问题 1 在Eclipse中添加依赖jar包不起作用问题     这种方式可能是Eclip...

    闵开慧
  • (十一) 初遇python甚是喜爱之Files文件读写操作

    各位读者大大们大家好,今天学习python的Files文件读写操作,并记录学习过程欢迎大家一起交流分享。

    亚乐记
  • 学生请假系统设计

    需求分析:学生日常请假出入校门,学生向教师请假,教师在手机中提交请假信息,提交后可按请假时间出校门。教师可查看所有学生请假历史,统计分析,同时家长会看到自己孩子...

    热心的程序员

扫码关注云+社区

领取腾讯云代金券