天天看點

資料庫必知詞彙:JIT

在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