这个是我在 DataFunConf2023-深圳站上的分享整理的文字内容。

上一篇讲到了代码生成,这一篇我们会讲一下由代码生成引申出来的如下内容:

  • 即时编译(JIT)
  • JIT在数据库表达式计算中的应用
  • Arrow Gandiva

JIT

JIT(Just-in-time Compilation),即时编译,也称为运行时编译,是一种执行计算机程序的方法。程序是在执行过程中,而不是执行之前进行编译。

Java为例,下图的流程描述了Java程序从源代码到机器字节码的流程以及JIT在这个流程中的位置。

JIT

表达式求值

在数据库领域,JIT技术应用在表达式代码生成,查询代码生成等多个方面。延续上一篇我们讲到的表达式求值,我们来看JIT技术在表达式求值过程中的作用。

Expr

  • 首先SQL解析器会将SQL表达式解析成抽象语法树
  • 其次表达式编译器再将抽象语法树生成中间字节码
  • 最后由JIT编译器再运行时生成机器字节码

Gandiva

Apache Gandiva是一个运行时表达式编译器,利用LLVM生成用于在Arrow Record Batch上进行计算的高效本机代码。Gandiva只用来处理在投影(Projection)和过滤(Filtering)阶段的表达式。

Gandiva

Gandiva充分利用Arrow内存格式和现代硬件。基于Arrow内存模型,由于Arrow数组为值(Data)和有效位图(Validity)分别提供缓冲区,因此值及其空值状态通常可以独立处理,从而实现更好的指令流水线。在现代硬件上,使用LLVM编译表达式使执行得以优化,以适应本地运行时环境和硬件,包括可用的SIMD指令。为了减少优化开销,许多Gandiva函数被预先编译成LLVM IR(中间表示)。

Gandiva Array

因为采用Arrow内存格式,Gandiva对向量化和SIMD的支持也是天然的。

Gandiva SIMD

此外Gandiva在提供异步线程控制,多语言支持,已经性能提升上都有着不错的表现。

References

  1. https://clickhouse.com/blog/clickhouse-just-in-time-compiler-jit
  2. https://www.pingcap.com/blog/10x-performance-improvement-for-expression-evaluation-made-possible-by-vectorized-execution/
  3. https://notes.eatonphil.com/2023-09-21-how-do-databases-execute-expressions.html
  4. https://blog.christianperone.com/2020/01/gandiva-using-llvm-and-arrow-to-jit-and-evaluate-pandas-expressions/
  5. https://questdb.io/blog/2022/01/12/jit-sql-compiler/
  6. https://www.vldb.org/pvldb/vol16/p829-boncz.pdf
  7. Everything You Always Wanted to Know About Compiled and Vectorized Queries But Were Afraid to Ask
  8. Vectorization vs. Compilation in Query Execution
  9. Exploring Query Execution Strategies for JIT, Vectorization and SIMD
  10. Using LLVM to accelerate processing of data in Apache Arrow
  11. Query Execution I (CMU Databases Systems / Fall 2019) Expression Evaluation (since 54:18)
  12. A New Frontier
  13. https://www.dremio.com/blog/announcing-gandiva-initiative-for-apache-arrow/
  14. Reinventing Amazon Redshift