
国产数据库-HTAP-MatrixOne的OLAP技术特性
MatrixOne是矩阵起源数据库创业公司打造的开源超融合异构数据库,能同时灵活支持OLTP、OLAP等不同工作负载。下面学习下其关于OLAP方面的技术特性。
为减少IO采用的技术特性:1)列裁剪;2)谓词下推;3)谓词推荐;3)Runtime filter
列裁剪:当然基于列存,扫描时,仅扫描需要的列。不扫描不相干列
谓词下推:将一些过滤条件直接下推到读取数据这一部分,可以尽量少的读取数据。比如GreenPlum数据库,它的列存是AOCO,列存读取时会将扫描所有记录,并不会在列存上进行过滤,过滤操作在SeqScan算子这一层。这样的话,大大增加了IO的代价。如果有朋友使用GreenPlum,也可以参考这一特性,将谓词下推到AOCO列存上。
谓词推断:说是会影响TPCH里面的Q7和Q19。谓词下推是已经确定显式可以下推的一个位置。但谓词推断可能需要做一些逻辑上的变化,才能得到一些新的谓词,这个新的谓词才可以下推下去。比如TPCH中的Q19的过滤条件是3个很长的谓词通过or连接。这3个or里有很多共同部分,可以把共同部分提取出来。
Runtime filter:用于hash join中。大表和小表进行join,小表构建完hash表后,可能hash表的计数非常小,这样我们可以直接通过hash表里面不同的词去大表里面通过runtime或者元数据信息进行过滤,这样在运行时就大大减少了需要读取的大表的block数量。普通hash join会对大表的每一行去hash表进行探测。他这里通过hash表里的值去大表的元数据信息里面进行过滤,过滤掉不满足join条件的值,从而仅加载大表满足条件的记录所在block。当然这里的前提是,MatrixOne的列存需要有一些元数据信息,比如每个block的min、max等值。另外字节跳动火山引擎ByteHouse的hash join中也用到了此项技术:join中除了join条件外,针对右表还有过滤条件,右表过滤后结果集比较小时,使用该结果集值针对join条件去对左表进行过滤,仅对满足条件的值构建hash表:字节跳动火山引擎ByteHouse的hash join
为减少计算采取的特性:聚合函数的下推和上拉操作。聚合函数在join上面,若先join,之后再聚合:那么join这里数据会膨胀很多。若将聚合下推到join下面去做,也就是先聚合再join,数据就会少很多,大大减少计算。
支持了向量化引擎。利用SIMD指令构造向量化执行通道。代码在pkg/vectorize目录下。
支持了Pipeline引擎。自底向上push调度,以数据为中心而不是算子操作为中心。执行器是基于push模型,可以把几个连续的operator组成一个流水线,而且流水线里面流动的数据,并不是一行一行的数据,而是TAE存储引擎里面的一个block,包含8192行数据,对于一般的数字类型是可以直接放进L1 Cache里面的,对缓存非常友好。每一个operator每一次要处理完这8192行才会喂给下一个operator,再加上调度是从最下面的,实际读取每一张表的table scan 那个节点开始,往上面push。对于push模型,是以数据为中心而不是以operator为中心,它的生成过程是对上一步的planner和optimizer生成的逻辑计划,作一个后续遍历,后续遍历之后就可以得到一个基础的pipeline结构,这个基础的pipeline结构还没有带上比如每台机器有多少个CPU或者需要在多少个CN节点上去执行这样的信息。在后面实际执行的时候,再动态地根据这些基础信息去做扩展。
基于Go语言开发,基线地址:
https://github.com/matrixorigin/matrixone
本文分享自 yanzongshuaiDBA 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!