隨著數字化技術對各行各業的不斷滲透,人大金倉在金融、能源、電信等行業逐步進入深水區,面臨越來越多的核心類系統改造升級,這些系統不僅需要滿足在線交易系統運行的高實時性要求,還需要保證高效分析能力以幫助客戶進行業務決策。
數據庫中SQL表達式及PLSQL代碼實現的都是通用邏輯,這就導致在語句執行過程中可能形成大量不必要的邏輯跳轉和代碼分支遍歷,進而成倍甚至成指數級增加底層指令的執行,造成CPU過高壓力。尤其在較為復雜分析類計算場景中,這種性能損耗尤其嚴重。
為了解決這種無效性能損耗,KES使用動態編譯(Just-in-time compilation,JIT)技術,將代碼扁平化執行。簡單說就是通過直接調用對應的函數,并且在已知輸入情況下精簡代碼邏輯分支的方式,在復雜計算的分析場景下顯著降低CPU單位負載壓力,有效提高數據庫整體性能。
什么是JIT
在解釋JIT之前,我們先來了解下什么是編譯器:它是將高級語言源代碼翻譯成機器語言(或翻譯成比原始程序低級代碼)的程序。
從“代碼”到“代碼”的轉換:
轉換后的代碼:
-計算機可以直接執行的機器語言(本機代碼);
-比原始程序低級的中間語言代碼。
在以前,程序通常有兩種編譯運行方式 - 靜態編譯與動態直譯,現如今又出現了即時編譯方式。
提前 (Ahead-of-Time: AOT) 編譯 - 即靜態編譯:在運行應用程序之前預編譯應用程序的編譯。
典型代表:C
-將源代碼 (.c) 轉換為機器語言(本機代碼);
-建二進制文件;
2、解釋器(interpreter)- 動態直譯:執行以編程語言編寫的源代碼或中間表達式并按順序解釋它們的程序。
典型代表:JAVA-JVM
-代碼“在解釋的同時執行”;
-優點是無需事先編譯,程序獨立于特定架構;
-缺點是運行性能低。
3、即時 (JIT) 編譯:在軟件執行期間編譯代碼以提高執行速度的編譯器;
JAVA
-在運行時將頻繁執行的方法編譯為機器代碼;
Python + Numba
-在運行時編譯并運行指定函數。
即時 (JIT) 編譯融合了前二種編譯方式,一句一句編譯源代碼執行,同時將編譯過的代碼緩存起來以降低性能損耗。相對于靜態編譯,即時編譯的代碼可以處理延遲綁定并增強安全性。簡單的說,JIT 是一種提高程序運行效率的方法。
KES如何實現JIT
KES基于LLVM實現JIT特性。
KES把對應的JIT 的提供者封裝成一個依賴庫,從而避免了JIT 對內核代碼的侵入性。用戶可以按需開啟或關閉JIT功能;通過進一步的抽象,KES還提供支持后期擴展不同JIT的解決方案。其JIT實現過程概述如下:
1.表達式的中間表示(Exprstate)轉換為LVMM的中間表示(LVMM IR);
2.使用LVMM進行JIT編譯,轉換為機器代碼;
3.KES執行器將其做為內部函數調用執行;
KES基于JIT提供的優化項
1、表達式計算優化
針對WHERE 條件判斷、聚合運算等場景實時將表達式的路徑編譯為具體代碼執行,在此過程中大量的不必要的調用和分支跳轉會被優化掉。
2、存取層優化
數據庫執行器通過存取層裝載數據,針對特定的表結構,可以定制讀取和解析元組的代碼。如在解析元組的流程中,根據表結構動態生成的代碼,無需做數據類型的重復判斷,只按照順序解析數據;以及在獲取部分列時實現直接根據對應偏移量提取的數據,跳過不需要提取的列,從而降低計算及I/O開銷。隨著處理的數據量的增加,節省的計算及I/O量將是驚人的。
3、執行器流程優化
LLVM中實現了對產生的中間表示代碼(IR)的優化,這一定程度上也會提升數據庫查詢的執行速度。從每一行數據的處理優化提升到整條 SQL 的處理流程優化:從傳統的相對低效的流水線執行方式調整為循環批量處理方式,從而充分利用 CPU緩存,盡量避免去相對慢得多的內存中存取數據;再結合 CPU 向量計算相關指令集,進一步提高性能。
JIT會提升CPU密集型查詢的性能,而對于短查詢的優化有限,KES默認開啟動態編譯(JIT),運行時會比較查詢的評估代價與JIT代價閥值的大小,判斷是否執行JIT編譯。用戶也可以根據業務需要主動設置JIT參數關閉動態編譯。
JIT優化性能實測
下面通過一個客戶業務分析場景的脫敏簡化版對比說明JIT對SQL執行性能的提升:
EXPLAN ANALYZE結果:
總結展望
JIT可以幫助KES數據庫優化SQL執行邏輯,加快復雜SQL的查詢速度,從而提升KES整體性能。在TPC-H等數據庫測試中,KES的JIT編譯表達式執行速度快了不止20%;在JIT模式下,創建索引的速度普遍可以提高5%-19%。
作為國內成立最早、底蘊最深的數據庫國家隊,人大金倉始終以用戶為中心,致力于提供卓越的數據庫產品與服務。金倉人在廣泛關注及學習前沿技術的同時,堅持自主創新,不斷落地新理論,融合新技術,以滿足日趨多元且極致的新需求,提升產品核心競爭力,持續為千行百業數字化轉型升級賦能。