乐趣区

关于postgresql:数据库向量化入门与实现

随着数据库软硬件技术的倒退,经典的 SQL 计算引擎逐步成为数据库系统的性能瓶颈,尤其是对于波及到大量计算的 OLAP 场景。

如何充分发挥底层硬件的能力,晋升数据库系统的性能,成为近年来数据库畛域的热门钻研方向,而向量化执行就是解决上述问题的一种无效伎俩,本文次要对向量化技术的原理及长处进行简略的介绍。

为什么数据库须要向量化?

MPP 数据库的 API(Application Programming Interface)或者命令行接管到了 SQL 查问申请之后,零碎先通过查问解析,而后进行查问优化,通过任务调度执行从存储引擎外面把数据读取进去,计算出后果集,返回给客户。
一个查问语句通过词法剖析、语法分析、语义查看后生成的后果叫做 Query Tree,通过优化器之后的后果叫做 Plan Tree。

传统数据库执行查问打算通常采纳火山模型的形式,流程如上图所示。

火山模型具备简略、直观、易用等长处,晚期数据库受限于硬件程度,IO、内存和 CPU 资源都十分低廉,火山模型可能极大缩减内存使用量,因此被各大厂商广泛采纳。

现在,随着硬件技术的一直倒退,火山模型的弊病也逐步凸显。这种形式存在重复性执行多、反序列化代价高、数据局部性差等缺点,而且一次执行仅解决一行数据,CPU 破费大量工夫在遍历查问操作树上,同时也没有针对 CPU 的 SIMD 能力等个性做优化,从而造成查问执行效率低下的问题。

据咱们在 PostgreSQL 上理论测试,对于 select sum(a) from table 这样的查问,火山模型在执行查问打算时,大部分工夫用于读取数据、对数据的反序列化、遍历执行树等操作上,用于理论 SUM 运算的工夫有余 4%。

为了进一步晋升 SQL 计算引擎的性能,数据库执行器畛域呈现向量化和编译执行的新技术。这两种技术的呈现都是为了晋升性能,更精确地讲是为了晋升 CPU 的运行性能。

编译执行是把简单运算编译成一个函数,反复调用失去后果。编译执行的长处是能够缩小分支判断,并使函数调用栈变浅。

向量化执行指的是将一次计算一条元组的模式,转换为一次计算多条元组的向量化计算。通过实现批量读取和解决,大大精简了函数调用开销,缩小了反复运算,减少了数据的局部性,进步了执行效率。

HashData 向量化的实际

对于像 HashData 这样采纳云架构的数据仓库而言,向量化能够通过晋升单节点的执行能力,使整个集群的运算性能失去很大晋升。列存数据的高压缩比不仅节约了存储空间,同时在向量化运算过程中也有着人造的性能劣势。

HashData 在实现向量化的过程中,引入了 Apache 软件基金会开源我的项目 Apache Arrow。Arrow 定义了规范的形式来示意可无效解决的内存数据,同时反对多种风行的编程语言中,包含 Java、C、C++ 和 Python 等。

Apache Arrow 的子项目 Gandiva 提供了编译执行向量化运算的可能,在利用于数据库表达式计算时,绝对于解释执行的向量化运算也有显著的性能劣势,然而因为百毫秒量级的编译工夫,不利于小数据量查问,因而须要在优化阶段依据数据情景决定是否应用。

为确保分布式数据库的底层数据的稳固传输,Arrow 提供了基于 gRPC 的过程间通信 Flight,其容许数据以 Batch 的模式同时进出服务器集群,让开发人员能够更轻松地创立可扩大的数据服务。

依据咱们在 PostgreSQL 单机测试的后果,在应用 Arrow 做向量化执行后,ORC 数据格式 + 向量化,绝对于 heap 表加 + 行引擎,在最好的情景下能够取得 30 倍以上的数据性能晋升。

数据库的向量化不仅仅是数据存储和运算的向量化,还是一个微小的性能优化工程。将来,HashData 会继续优化、欠缺向量化执行,晋升零碎性能,更好地满足客户业务需要。

退出移动版