SIMD(Single Instruction Multiple Data) 单指令流多数据流,是一种采用一个控制器管理多个处理器,同时对一组向量数据中每个数据分别执行相同的操作,从而实现空间上的并行计算的技术。即基于SIMD实现一条指令同时处理多个数据,将传统的标量计算转为向量计算,从而减少CPU周期数,提升计算效率。

备注: 标量计算VS向量计算示意图[1]
数据库执行模型对于优化查询性能和系统资源利用率至关重要,火山模型和向量化模型是两种数据库常见的执行模型。
火山模型(Volcano Model): 也称为迭代模型,将查询计划分解为多个迭代器,每个迭代器实现一个next()接口,查询执行时,数据按行迭代并自底向上被拉取(Pull Based)处理。该模型灵活性高并且易于实现,但每次单行数据处理,需要多次调用next()接口,导致虚函数调用开销增加。

向量化模型(Vectorized Model): 也称为批处理模型,最早在 MonetDB-X100系统的论文《MonetDB/X100: Hyper-Pipelining Query Execution》中提出的。每个迭代器实现next()函数时,一次返回一批数据,基于SIMD指令集处理向量计算,从而实现计算提效。该模型通过按批迭代计算,可减少函数调用开销,增加数据的局部性,大幅提升数据密集型任务的计算效率。但该模型实现较为复杂,且小数据量的计算提效不明显。

向量化执行模型已在现代数据库引擎被广泛应用,例如ClickHouse、TiDB、StarRocks等。为进一步提升计算性能,充分利用CPU计算能力,大数据计算引擎的不同厂商也针对向量化计算进行多样化探索。
Databricks 2022年推出商业化产品 Photon ,旨在增强Spark计算而写的Native C++ 向量化计算引擎。其执行层架构如图所示[2],Photon向量化计算基于最底层的Task调度粒度处理 。扩展新的转换规则将原物理计划转为Photon物理计划,在Task级别实现向量化计算,提供高效的湖仓一体计算模式。Photon向量化执行引擎取代了已有的Spark执行模式(JVM & Codegen)。

Apache DataFusion: 基于 Apache Arrow 实现的可扩展查询引擎,使用Rust语言编写,提供SQL解析和查询优化等功能。架构设计如图所示[3],包括四部分: 1. 前端: 语法/语义解析并转为逻辑计划;2. 逻辑计划: 查询中间表示,包括Expression(表达式)/ Type system(类型系统);Query Plan/ Relational Operators(关系算子);Rewrites/ Optimizations(逻辑计划优化);3. 物理计划: 查询底层表示,主要包括 Rewrites/ Optimizations(物理计划优化); 4. 运行时算子: 分配计算资源,基于Arrow 和RecordBatch批数据处理提供向量化计算能力。

Blaze是2023年由快手开源的自研项目,基于Rust语言和DataFusion框架开发的Spark向量化执行引擎。Blaze作为中间层,从 Spark获取优化后的物理计划,将其转换为 DataFusion 执行计划,最终在Spark Executor中基于Task计算执行。Blaze同时结合了DataFusion 库的强大功能和 Spark 分布式计算框架的可扩展性,但目前可支持向量化的算子覆盖率较低。架构设计如图所示[4]: 引入Blaze Session Extension 扩展,将物理计划转为NativeRDD,在Task级别基于JNI提交给Native引擎执行。

Apache DataFusion Comet 是2024年由Apple公司主导开源的Spark向量化执行引擎,与Blaze类似,该项目以 Apache DataFusion 查询引擎 和 Arrow 列式数据格式为基础构建向量化能力。
Velox 是Meta公司2022年开源的C++高性能计算引擎库,旨在基于Native原生引擎作为统一的执行层(Unified Execution Engine)。Velox并不是完整的SQL执行引擎,不包括SQL解析、SQL逻辑优化等功能,它基于优化后的计划树作为输入,提供常见算子的Native执行能力,支持在本地高效向量化计算。
Prestissimo 由Meta于2020年创建,在Presto中引入Velox库扩展向量化执行,其中Presto Coordinator 基于JVM实现 SQL 解析、查询优化以及管理任务分布式执行,使用C++重写Presto Worker,底层的算子数据操作基于Velox执行。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。