JIT在数据库表达式求值的应用
这个是我在
DataFunConf2023-深圳站
上的分享整理的文字内容。
上一篇讲到了代码生成,这一篇我们会讲一下由代码生成引申出来的如下内容:
- 即时编译(JIT)
- JIT在数据库表达式计算中的应用
- Arrow Gandiva
JIT
JIT(Just-in-time Compilation),即时编译
,也称为运行时编译
,是一种执行计算机程序的方法。程序是在执行过程中,而不是执行之前进行编译。
以Java
为例,下图的流程描述了Java
程序从源代码到机器字节码的流程以及JIT
在这个流程中的位置。
表达式求值
在数据库领域,JIT技术应用在表达式代码生成,查询代码生成等多个方面。延续上一篇我们讲到的表达式求值,我们来看JIT技术在表达式求值过程中的作用。
- 首先SQL解析器会将SQL表达式解析成抽象语法树
- 其次表达式编译器再将抽象语法树生成中间字节码
- 最后由JIT编译器再运行时生成机器字节码
Gandiva
Apache Gandiva是一个运行时表达式编译器,利用LLVM生成用于在Arrow Record Batch上进行计算的高效本机代码。Gandiva只用来处理在投影(Projection)和过滤(Filtering)阶段的表达式。
Gandiva充分利用Arrow内存格式和现代硬件。基于Arrow内存模型,由于Arrow数组为值(Data)和有效位图(Validity)分别提供缓冲区,因此值及其空值状态通常可以独立处理,从而实现更好的指令流水线。在现代硬件上,使用LLVM编译表达式使执行得以优化,以适应本地运行时环境和硬件,包括可用的SIMD指令。为了减少优化开销,许多Gandiva函数被预先编译成LLVM IR(中间表示)。
因为采用Arrow内存格式,Gandiva对向量化和SIMD的支持也是天然的。
此外Gandiva在提供异步线程控制,多语言支持,已经性能提升上都有着不错的表现。
References
- https://clickhouse.com/blog/clickhouse-just-in-time-compiler-jit
- https://www.pingcap.com/blog/10x-performance-improvement-for-expression-evaluation-made-possible-by-vectorized-execution/
- https://notes.eatonphil.com/2023-09-21-how-do-databases-execute-expressions.html
- https://blog.christianperone.com/2020/01/gandiva-using-llvm-and-arrow-to-jit-and-evaluate-pandas-expressions/
- https://questdb.io/blog/2022/01/12/jit-sql-compiler/
- https://www.vldb.org/pvldb/vol16/p829-boncz.pdf
- Everything You Always Wanted to Know About Compiled and Vectorized Queries But Were Afraid to Ask
- Vectorization vs. Compilation in Query Execution
- Exploring Query Execution Strategies for JIT, Vectorization and SIMD
- Using LLVM to accelerate processing of data in Apache Arrow
- Query Execution I (CMU Databases Systems / Fall 2019) Expression Evaluation (since 54:18)
- A New Frontier
- https://www.dremio.com/blog/announcing-gandiva-initiative-for-apache-arrow/
- Reinventing Amazon Redshift