一起探索內(nèi)存數(shù)據(jù)庫中代碼生成的實現(xiàn)方法
根據(jù)軟件基本方法:程序 = 數(shù)據(jù)結(jié)構(gòu) + 算法,那么依托代碼生成來提升內(nèi)存數(shù)據(jù)庫的查詢性能十分可行,這篇內(nèi)容想通過一個實例來為大家介紹如何依托代碼生成來提升查詢性能,我想舉一個RapidsDB的例子。
?
首先看代碼生成的架構(gòu)。代碼生成使用專門的編程語言,選用這門語言的原因是使用簡單、管理嚴(yán)密。SQL操作符樹將會被直接轉(zhuǎn)化為抽象語法樹,以化解在查詢編譯時對昂貴的解析和語義解析的需求。
?
除了語言的簡單性以外,其還受益于將許多關(guān)系操作作為原語公開,如“索引查找”和標(biāo)量操作,如“BIGINT加法”。這些操作符是與服務(wù)器一起靜態(tài)編譯的,可以很容易地組合成查詢。這樣,許多編譯工作就可以提前完成。
?
接下來,再來看數(shù)據(jù)庫字節(jié)編碼。編譯查詢時,RapidsDB首先展開成緊湊的格式,也可以稱為RapidsDB字節(jié)碼。這種格式的執(zhí)行計劃可以輕易的進(jìn)行序列化、解釋或轉(zhuǎn)換為LLVM位代碼,以便編譯成x86_64機(jī)器代碼。這種直接解釋字節(jié)碼基本消除了第一次運(yùn)行查詢的成本,但會影響查詢執(zhí)行的性能:
?

在這個例子中,第一個請求沒有額外的延遲產(chǎn)生,因為該查詢被解釋了。
?

上面例子的第一個請求的額外延遲是代碼生成的結(jié)果。但是,后續(xù)的請求速度是上門解釋執(zhí)行的速度的兩倍。
?
在RapidsDB的應(yīng)用項目實例中,在國有大行普惠金融項目應(yīng)用中,50%左右的查詢是結(jié)構(gòu)重復(fù)的查詢,而RapidsDB依托代碼生成的優(yōu)化特性降低了50%-80%的查詢時間,獲得很好的使用體驗。
?
好了,代碼生成我們介紹到這。