PostgreSQL 什么是JIT編譯?

2021-09-01 17:54 更新
31.1.1. JIT加速的操作
31.1.2. 內聯(lián)
31.1.3. 優(yōu)化

即時(Just-In-Time,JIT)編譯是將某種形式的解釋程序計算轉變成原生程序的過程,并且這一過程是在運行時完成的。例如,與使用能夠計算任意SQL表達式的通用代碼來計算一個特定的SQL謂詞(如WHERE a.col = 3)不同,可以產(chǎn)生一個專門針對該表達式的函數(shù)并且可以由CPU原生執(zhí)行,從而得到加速。

當使用--with-llvm編譯PostgreSQL后,PostgreSQL內建支持用LLVM執(zhí)行JIT編譯。

進一步的細節(jié)請參考src/backend/jit/README。

31.1.1. JIT加速的操作

當前,PostgreSQLJIT實現(xiàn)支持對表達式計算以及元組拆解的加速。未來可能有更多其他操作采用這種技術加速。

表達式計算被用來計算WHERE子句、目標列表、聚集以及投影。通過為每一種情況生成專門的代碼來實現(xiàn)加速。

元組拆解是把一個磁盤上的元組(見第 68.6.1 節(jié))轉換成其在內存中表示的過程。通過創(chuàng)建一個專門針對該表布局和要被抽取的列數(shù)的函數(shù)來實現(xiàn)加速。

31.1.2. 內聯(lián)

PostgreSQL有很好的擴展性并且允許定義新的數(shù)據(jù)類型、函數(shù)、操作符以及其他數(shù)據(jù)庫對象,見第 37 章。實際上,內建對象都使用近乎完全相同的機制來實現(xiàn)。這種可擴展性隱含了一些開銷,例如函數(shù)調用帶來的開銷(見第 37.3 節(jié))。為了降低這類開銷,JIT編譯可以把小函數(shù)的函數(shù)體內聯(lián)到使用它們的表達式中。這種方式可以優(yōu)化掉可觀的開銷。

31.1.3. 優(yōu)化

LLVM支持對生成的代碼進行優(yōu)化。一些優(yōu)化代價很低,以至于可以在每次使用JIT時都執(zhí)行,而另一些優(yōu)化則只有在運行時間較長的查詢中才能獲益。更多有關優(yōu)化的細節(jié)請參考https://llvm.org/docs/Passes.html#transform-passes


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號