数据库优化技术之向量化计算和编译执行

0 介绍

最近开始接触一个战斗民族开发的列式数据库ClickHouse,它是一个高性能的OLAP,根据一些测试,它的查询效率达到mysql的数十到数百倍。那么至于它的性能为何如此之高,一个很重要的优化就是它实现了向量化计算和编译执行,这里介绍几篇文章解释这两个优化操作。

1 火山模型

在谈优化之前,不妨先读一下这篇文章火山模型介绍。火山模型的缺点在于每次都是计算一个 tuple(Tuple-at-a-time),这样会造成多次operator节点调用 next ,也就是造成大量的虚函数调用,这样会造成 CPU 的利用率不高。

2 向量化计算和编译执行

这篇文章向量化与编译执行浅析讲的很好。
火山模型是一个拉取模型,编译执行则实现了一个推送执行模型,它利用LLVM生成中间语言,自底向上将tuple留在寄存器中,每个Operator直接处理寄存器中的数据。
至于向量化计算则比较容易理解,它依然采用类似火山模型的拉取式模型,唯一的区别是其Operator的next()函数每次返回的是一批数据。通过使用SIMD(Single Instruction Multiple Data,单指令流多数据流),SIMD 可以在一条 CPU 指令上处理 2、4、8 或者更多份的数据,这样大大提升了效率。
这两种方法是不兼容的,不过也有系统实现了兼容。ClickHouse是如何实现的,我后面研究研究。

猜你喜欢

转载自blog.csdn.net/MoonWisher_liang/article/details/115336286