列式存储和行式存储的真正区别

1 列式存储和行式存储的真正区别

参考文献: 列式存储和行式存储的真正区别_过往记忆大数据_公众号文章

  • 一般原因:查询需要的字段时,Column-Store 只需读取需要的列,Row-Store读一条记录会把 所有字段都读出来。Column-Stroe在IO上效率更高。

  • 块遍历
      单记录遍历:读出行,对每行抽取出需要的列,再对这些列调用相应的函数。函数调用的次数与数据的条数为 1 : 1 1:1 1:1
      块遍历:批量处理,一次性处理多条数据,函数调用次数下降,性能提高。
    .
      块遍历和单记录遍历是两种遍历方法,Column-Store和Row-Store都可以使用。区别是:对于Column-Store,块遍历已经成为共识,大家都这样做。对于Row-Store,需要用case-by-case实现。
      并且Column-Store的列值在字节意义上等宽时(例如,每个列都是数字类型),还可以进一步提高性能。因为从一个块里取值时可以直接用数组下标获取数据。以数组的方式我们还可以用现代CPU的一些优化措施比如SIMD(Single Instruction Multiple Data)来实现并行化执行,进一步提高性能。

  • 压缩
    压缩就是对数据进行更高效的编码,从而用更少的空间表达相同的意思。
    而能够进行更高效的编码的前提是数据要有某种规律。比如很多数据一样,或者数据的类型一样。
    Column把一列数据保存在一起,而一列的数据类型相同。当然比Row-Store把一条记录里面不同类型的字段值保存在一起,更有规律,更有规律意味着可以有更高的压缩比。
    数据占用的硬盘空间越少,查询时 IO的时间就越少
    数据压缩之后,要进行处理很多时候也需要解压缩,解压缩也需要花时间,所以一般需要在压缩比和解压速度之间做一个权衡
    有的场景下,可以避免解压缩,直接在压缩数据的格式上进行计算,这样就可以进一步提升性能 。
    最好对数据排序之后,再对Column-Store使用压缩进行优化。如果不经过排序,数据就没那么“有规律”,也就达不到最好的压缩比。

  • 延迟物化
    什么是物化?为了把底层存储格式与用户查询表达的意思对应起来,需要在查询生命周期的某一个时间点,将数据转换成Row的形式,这在Column-Store里面被称为物化
    在这里插入图片描述
    延迟物化就是尽量把物化的时机延迟到查询生命周期的后期。这意味着在查询生命周期的前期,查询执行的模型不是关系代数,而是基于Column。举例:

select name 
from person
where id > 10 and age > 20

一般的做法,取出三列,立刻物化成一行行的Person数据(同一个Person在三列里的数据,抽取出来构成一行),然后应用过滤条件(id > 10 and age > 20)选出对应的行,再从剩下的行中抽出需要的字段(name)。
在这里插入图片描述
延迟物化,先不拼出行式数据,直接在 Column数据(id、age)上分别应用两个过滤条件,得到两个满足过滤条件的bitmap,然后两个bitmap做位与(bitwise AND)得到同时满足两个条件的所有的bitmap(Intersected bitmap,position)。因为需要的只是name字段,所以下一步拿着这些position对name字段的数据进行过滤得到最终的结果。
在这里插入图片描述
可以发现整个过程中压根没有进行物化操作,从而可以提高效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张之海

若有帮助,客官打赏一分吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值