15-721 Chapter8 数据分布model分析

Data Organization

有两个data pool,一个是不可变长的block,一个是可变长的block,然后要定位的话,我们只要知道是哪个block,和他的offset,我们就可以定位

 下面是数据类型,单个类型太大的话,我们要来个溢出的存储,用指针指向他。

然后如果是用浮点数表示的话,有个问题,就是有些数不能准确表示,分场景权衡,如果我们设计钱的话,我们一般用定点小数,有点像字符串,demical, numeric,但andy好像说有个闭源的实现在一些情况下比浮点数还快。

 数据读取

可以通过C++的reinterpret_cast来重新解释指针,我们要先定位到该数据地址开头

 大的话,就像上面说的那样要用指针指向别的,同时可以在开头利用空余记录一下前缀,如果前缀不同的话,就不必冒着cache miss的风险去寻址了。

如果对待NULL值

最常见的版本是第二个,最后一个的话,基本没人用。因为要位寻址对于位寻址来说,由于需要进行位操作,因此它通常需要更多的处理器周期来完成一个读写操作。这是因为现代计算机中的内存系统通常是以字节为单位进行操作的,而在位寻址中,需要使用掩码等技术来提取或设置单个位,这会导致额外的运算开销。相比之下,字节寻址通常具有更好的性能,因为它可以直接读写整个字节,而不需要进行位级别的操作。此外,现代计算机中的缓存系统通常也会优化字节寻址的性能,因为它们可以一次性读取或写入多个字节,从而减少了内存访问的次数。

cache line

基本上我们只要考虑第一个,接下来介绍一下第一个的具体意思:在计算机内存中,数据通常以固定大小的块进行传输和处理。这些块称为缓存行(Cacheline),它们的大小通常是64字节。当你尝试访问内存中一个不在缓存行开头的地址时,CPU会将整个缓存行加载到缓存中,即使你只需要其中的一部分当你的数据结构跨越两个缓存行时,读取这个数据结构的操作需要访问两个缓存行。这可能会导致性能下降,因为CPU需要花费额外的时间来加载第二个缓存行。如果你精心设计数据结构,使其大小为64字节的倍数,那么每个数据结构就恰好适合于单个缓存行中,并且CPU可以更快地读取它们。所以,如果你的数据结构大小不是64字节的倍数,它可能需要跨越两个或更多个缓存行。这可能会导致额外的内存访问和性能问题。

如何解决:

我们可以通过padding,使得下一个type对齐,或者重排,让尽可能多的type对齐word. 

Storage Model

行存,对oltp友好

 列存,对olap,也就是分析性数据库优好。

列存的设计及其优化

对于tupleid的选择

 sort最大的好处就是可以压缩,比如几个男的,几个女的,这种就可以极大的压缩

同时论文里面的提到的为了动态最优,我们不能使得这个结构固定,我们要通过控制分区的精度来对负载的不同来调节,从而提升性能。

此外,我们也可以把数据区分成 冷热两部分来应对workload

catolog 

可以参考的资料:《Optimal Column Layout for Hybrid Workloads》论文读后感 - 知乎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值