在PostgreSQL等数据库中,JIT指的是即时编译(Just-in-time Compilation),即程序在运行过程中即时进行编译,其中可以把编译的中间代码缓存或者优化。相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性。
简单的说 JIT 是一种提高程序运行效率的方法。通常,程序有两种运行方式:静态编译与动态直译。静态编译的程序在执行前全部被翻译为机器码,而直译执行的则是一句一句边运行行边翻译。 JIT 则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性。
数据分型业务往往处理的数据相当庞大。单个任务(SQL)往往使用相同的模式处理少则几十 GB,多则 TB级 的数据。如果我们拿到用户的 SQL 后使用 JIT 技术生成一段“精简”的代码再执行,效率会大大提高。这样的思路早在一些高端大气的商业产品中得到了使用,例如 IBM DB2 中就产品化了类似的特性。称作 threaded code generation 技术,动态生成效率较高的 section 来优化 CPU 执行效率。
PostgreSQL 11 中实现的JIT,是把对应的JIT 的提供者封装成了一个依赖库。这避免了JIT 对主体代码的侵入性,用户可以按需开启/关闭JIT 功能,而且还能通过进一步的抽象支持后期扩展不同的JIT 解决方案(目前使用的是LLVM)。不过这样带来的问题就是各个部分使用JIT 技术编译的代码必须和原来的代码位置分开,这样代码易读性可能有所降低。
资料来源:
PgSQL · 特性分析· JIT 在数据仓库中的应用价值 http://mysql.taobao.org/monthly/2016/11/10/?spm=a2c4e.10696291.0.0.779f19a4sj5A7r
PgSQL · 特性分析 · 浅析PostgreSQL 中的JIT https://yq.aliyun.com/articles/717101