代码生成或者说即时编译在数据库中使用比较多,常见的包括了用户输入的表达式、查询、存储过程等,会将其编译成二进制代码再执行,相比解释执行的方式运行效率要高很多。
简介
当前已经有很多数据库实现了 JIT 方案,只是支持的范围、实现方案有所区别,常见的有 PostgreSQL、ClickHouse 等,两者基于 LLVM 实现;其它的如 Spark 是基于 JVM 实现的;而 SQLite 有个自己的 VM 实现。
其中 PostgreSQL 将 JIT 相关内容抽象为通用的三方库,而 ClickHouse 则直接通过 LLVM 实现,两者在实现时都没有使用 LLVM 中类似 MCJIT、ORC 的方案。
对于一条 SQL 来说,其中如下的几部分是可以考虑作编译的:
- 表达式,包括了 Where 后的谓词表达式,还有在 Projection、GroupBy、Aggregation、Join 等字句。
- 算子,常见的是在执行过程中对多个算子进行合并。
- 数据解析,可以根据 Schema 对代码进行特化处理。
Expression
Operator
参考
- Getting Started with LLVM Core Libraries 这本书有点牛批,极力推荐参考。