相關(guān)申請案交叉申請
本申請要求于2015年4月15日遞交的發(fā)明名稱為“在數(shù)據(jù)庫查詢執(zhí)行引擎中利用參數(shù)化中間表示進行即時編譯的裝置和方法”申請?zhí)枮?4/687,473的美國非臨時專利申請案的權(quán)益和在先申請優(yōu)先權(quán),該在先申請的內(nèi)容以引入的方式并入本文。
本發(fā)明涉及數(shù)據(jù)庫處理,在特定實施例中,涉及在數(shù)據(jù)庫查詢執(zhí)行引擎中利用參數(shù)化中間表示進行即時編譯的裝置和方法。
背景技術(shù):
在現(xiàn)代數(shù)據(jù)系統(tǒng)中,例如通過采用固態(tài)磁盤(solidstatedrive,簡稱ssd)設(shè)備很大程度上避免了慢磁盤訪問時,查詢執(zhí)行的中央處理器(centralprocessingunit,簡稱cpu)的成本變得越來越關(guān)鍵。即時(just-in-time,簡稱jit)編譯是用于提高數(shù)據(jù)庫系統(tǒng)中cpu性能的方法。jit編譯指的是在程序執(zhí)行的運行時間而不是執(zhí)行之前進行的查詢執(zhí)行中的編譯方案。因為在代碼優(yōu)化、本地代碼生成以及編譯后的代碼的質(zhì)量方面的有效性,低級虛擬機(lowlevelvirtualmachine,簡稱llvm)編譯器的結(jié)構(gòu)對于jit編譯是很好的候選。所述llvm包括用于在運行時間生成特定查詢函數(shù)的中間表示(intermediaterepresentation,簡稱ir)的組合函數(shù)(稱作irbuilder)。相比編譯后的特定查詢函數(shù),所述llvm可以更加高效地從所述ir生成優(yōu)化的機器代碼。但是llvmir在運行時間通過llvmirbuilder生成代碼在時間和/或計算資源例如內(nèi)存等方面代價較高且容易出錯?;蛘呖梢岳胠lvm提供的clang/clang++等工具將c/c++代碼編譯成llvmir。如果所述c/c++代碼不是專門用于傳入查詢,該方法可能不會受益于jit編譯。因此需要一種更加高效地為查詢的jit編譯生成ir的方案。
技術(shù)實現(xiàn)要素:
根據(jù)一實施例,一種支持在數(shù)據(jù)庫管理系統(tǒng)中查詢即時(just-in-time,簡稱jit)編譯和執(zhí)行的方法包括:識別查詢中的中央處理器(centralprocessingunit,簡稱cpu)密集函數(shù),并且在所述cpu密集函數(shù)中識別一個或者多個參數(shù)。所述一個或者多個參數(shù)代表在不同查詢實例中可以變化的值的變量。將所述cpu密集函數(shù)編譯成包括所述一個或者多個參數(shù)的參數(shù)化中間表示(intermediaterepresentation,簡稱ir)。將所述cpu密集函數(shù)的參數(shù)化ir保存在參數(shù)化ir的目錄中。
根據(jù)另一實施例,一種支持在數(shù)據(jù)庫管理系統(tǒng)中查詢jit編譯和執(zhí)行的方法包括:將cpu密集函數(shù)編譯成包括一個或者多個參數(shù)的參數(shù)化ir。所述一個或者多個參數(shù)代表在不同的查詢實例中可以變化的的值的變量。所述方法還包括:將所述cpu密集函數(shù)的參數(shù)化ir保存在參數(shù)化ir的目錄中;并且在準(zhǔn)備執(zhí)行傳入查詢時,從目錄加載參數(shù)化ir。在所述參數(shù)化ir中利用所述傳入查詢的變量的常數(shù)值替代所述一個或者多個參數(shù);通過所述jit編譯利用替代所述一個或者多個參數(shù)的常數(shù)值編譯所述參數(shù)化ir,以生成執(zhí)行所述傳入查詢的機器代碼。
根據(jù)又一實施例,一種用于數(shù)據(jù)庫查詢執(zhí)行引擎的裝置包括:至少一個處理器以及用于存儲供所述至少一個處理器執(zhí)行的程序的非瞬時性計算機可讀取存儲介質(zhì)。所述程序包括指令,用于識別查詢中cpu密集函數(shù),并且在所述cpu密集函數(shù)中識別代表在不同查詢實例中可以變化的值的變量的一個或者多個參數(shù)。所述程序還包括指令,用于將所述cpu密集函數(shù)編譯成包括所述一個或者多個參數(shù)的參數(shù)化ir,并且將所述cpu密集函數(shù)的參數(shù)化ir保存在參數(shù)化ir的目錄中。
上述寬泛地概括了本發(fā)明實施例的特征,以便能夠更好理解以下本發(fā)明詳細(xì)描述。以下將描述本發(fā)明實施例其他的特征和優(yōu)勢,其構(gòu)成本發(fā)明權(quán)利要求書的主體。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,所公開的概念和特定實施例易被用作修改或設(shè)計其他實現(xiàn)與本發(fā)明相同目的的結(jié)構(gòu)或過程的基礎(chǔ)。本領(lǐng)域的技術(shù)人員還應(yīng)當(dāng)意識到,這種等同構(gòu)造不脫離所附權(quán)利要求書所闡述的本發(fā)明的精神和范圍。
附圖說明
為了更完整地理解本發(fā)明及其優(yōu)點,現(xiàn)在參考下文結(jié)合附圖進行的描述,其中:
圖1示出一種在數(shù)據(jù)庫管理系統(tǒng)中進行查詢處理的框架;
圖2示出針對查詢函數(shù)生成參數(shù)化ir的方法實施例;
圖3示出對查詢函數(shù)的參數(shù)化ir進行jit編譯的方法實施例;
圖4是一種能夠用于實現(xiàn)不同實施例的處理系統(tǒng)的示意圖。
除非另有指示,否則不同圖中的對應(yīng)標(biāo)號和符號通常指代對應(yīng)部分。繪制各圖是為了清楚地說明實施例的相關(guān)方面,因此未必是按比例繪制的。
具體實施方式
下文將詳細(xì)論述當(dāng)前優(yōu)選實施例的制作和使用。然而,應(yīng)了解,本發(fā)明提供可在各種具體上下文中體現(xiàn)的許多適用的發(fā)明性概念。所論述的具體實施例僅僅說明用以實施和使用本發(fā)明的具體方式,而不限制本發(fā)明的范圍。
本文所提供的系統(tǒng)和方法實施例用于將參數(shù)化中間表示(intermediaterepresentation,簡稱ir)用于數(shù)據(jù)庫查詢執(zhí)行引擎中的即時(just-in-time,簡稱jit)編譯。具體地,對于規(guī)定的查詢函數(shù),例如由所述數(shù)據(jù)庫執(zhí)行引擎處理的處理器(或者cpu)密集函數(shù),識別所述函數(shù)中針對特殊查詢可能不變(固定)的變量。所述變量在不同的查詢實例中有可以變化的值,因此可以用作查詢的參數(shù)。所述cpu密集函數(shù)可以是要求更多處理資源例如時間、內(nèi)存或者其他處理資源的函數(shù)。所述cpu密集函數(shù)可以通過cpu性能分析識別。所述識別的變量可以包括模式信息、表達式或者與所述變量相關(guān)的數(shù)據(jù)類型等。識別為不變量的變量可以提供更多的編譯器優(yōu)化,例如不可達代碼去除、循環(huán)展開、常量折疊和傳播、內(nèi)聯(lián)的虛函數(shù)調(diào)用或者通過函數(shù)指針進行調(diào)用。所述識別的變量均設(shè)置在cpu密集函數(shù)的ir模板中用作所述ir的參數(shù)。在利用ir編譯器例如llvmjit編譯器等進行jit編譯時,利用所述查詢特殊信息的常數(shù)值替代所述ir中的參數(shù),以生成用于執(zhí)行的優(yōu)化的機器代碼。
這里稱作參數(shù)化ir的帶有參數(shù)的ir模板是從初始函數(shù)(翻譯碼)靜態(tài)編譯,并且所述ir可以與唯一id和參數(shù)名一起保存在目錄表中。所述參數(shù)化ir在準(zhǔn)備執(zhí)行特殊查詢的運行時間加載,因此利用常數(shù)值替代所述ir中的參數(shù)以獲得修改后的ir。然后,對所述修改后的ir進行jit編譯,以生成用于所述函數(shù)的本地機器代碼。利用查詢函數(shù)中的一組指令同時生成和編譯參數(shù)化ir可以避免在運行時間為查詢特殊ir函數(shù)代價較高且容易出錯的逐條生成指令。通過保存參數(shù)化ir函數(shù)的通用版本,在運行時間加載所述ir,在向所述參數(shù)化ir添加查詢特殊信息之后,對所述ir函數(shù)進程jit編譯,不需要在運行時間針對每個jit編譯生成c/c++代碼。相比針對查詢生成c/c++代碼并且利用c/c++編譯器對查詢進行jit編譯,生成和編譯參數(shù)化ir的方案更快。
圖1示出一種在數(shù)據(jù)庫管理系統(tǒng)中進行查詢處理的框架100的示例。首先由解析函數(shù)110對sql查詢進行解析,然后由改寫函數(shù)120以適合執(zhí)行的形式相應(yīng)改寫??梢杂捎媱澓瘮?shù)130對改寫查詢進行分析,以確定其執(zhí)行參數(shù)或設(shè)置,然后生成查詢計劃。執(zhí)行函數(shù)140在本文也稱作查詢執(zhí)行引擎,其用于執(zhí)行改寫查詢計劃。所述執(zhí)行函數(shù)140包括以下三個步驟:準(zhǔn)備執(zhí)行器步驟141:分配運行時間數(shù)據(jù)結(jié)構(gòu),并且準(zhǔn)備查詢執(zhí)行;運行執(zhí)行器步驟142:以迭代的方式執(zhí)行所述查詢;結(jié)束執(zhí)行器步驟143:釋放運行時間數(shù)據(jù)結(jié)構(gòu),并且結(jié)束所述查詢執(zhí)行。上述函數(shù)可以通過在cpu或者合適的處理器上運行的軟件實現(xiàn)。
在一實施例中,所述執(zhí)行器140(所述數(shù)據(jù)庫查詢執(zhí)行引擎)利用參數(shù)化ir實現(xiàn)jit編譯。圖2示出針對查詢函數(shù)生成參數(shù)化ir的方法200的流程圖。所述方法包括:在查詢執(zhí)行引擎啟動之前,利用參數(shù)(參數(shù)化ir)識別并準(zhǔn)備ir模板。通過cpu性能分析(步驟210)識別可能受益于數(shù)據(jù)庫查詢執(zhí)行引擎中jit編譯的cpu密集函數(shù)(步驟211)。cpu性能分析包括:利用函數(shù)追蹤之前運行的查詢中的cpu性能,以確定隨著時間的推移cpu利用率的百分比和/或其他cpu資源或者性能指標(biāo)等;并且將追蹤到的所述函數(shù)的cpu性能與其他函數(shù)或者預(yù)定閾值的cpu性能進行比較。相應(yīng)地,需要上述cpu利用率的平均百分比或者資源的函數(shù)被歸類為cpu密集函數(shù)。在利用數(shù)據(jù)庫模式信息對每個cpu密集函數(shù)進行程序分析之后(步驟220),就可以識別所述函數(shù)中變量的參數(shù)(步驟221)。每個參數(shù)的值對于特定的傳入查詢是不變的,在ir中利用常數(shù)值替代所述參數(shù)期望能有益于jit編譯。然后,將所述函數(shù)靜態(tài)編譯成ir(步驟230),并且將所述參數(shù)信息添加至所述編譯后的ir,以獲得參數(shù)化ir,這些參數(shù)化ir均保存在目錄表中(步驟240)。所述表格也包括每個參數(shù)化ir的唯一標(biāo)識符(identifier,簡稱id),如下面示例性的表1所示。
表1:用于保存參數(shù)化ir的ir目錄表
所述唯一id可以有匹配其在表格中的ir的枚舉數(shù)據(jù)類型,并且用于在后期查詢執(zhí)行引擎中(在執(zhí)行運行時間)檢索所述ir。所述枚舉數(shù)據(jù)類型可以定義如下:
圖3示出通過利用參數(shù)化ir的jit編譯方法300進行的查詢進程。由于所述參數(shù)化ir是在查詢執(zhí)行之前準(zhǔn)備,數(shù)據(jù)庫查詢執(zhí)行引擎(執(zhí)行器140)可以在準(zhǔn)備執(zhí)行器步驟141基于唯一id從參數(shù)化ir的目錄表加載需要的參數(shù)化ir(步驟351),并將特定查詢信息添加至所述參數(shù)化ir中(步驟352)。然后所述執(zhí)行引擎可以對修改后的ir進行jit編譯,以生成優(yōu)化的機器代碼(步驟353),并將jit編譯后的函數(shù)的指針保存在運行時間數(shù)據(jù)結(jié)構(gòu)中(步驟354)。在運行執(zhí)行器步驟142的執(zhí)行查詢時,所述執(zhí)行引擎檢查所述jit編譯后的函數(shù)是否存在(步驟361),以確定調(diào)用這個jit編譯后的函數(shù)(步驟362)還是調(diào)用初始的解釋函數(shù)(步驟363)。
下面(c語言中的)代碼示出從postgresql提取出來的sdt_loop函數(shù)的示例:
在本示例中,所述sdt_loop函數(shù)被簡化并且從postgresql的查詢執(zhí)行引擎提取。所述sdt_loop函數(shù)用于從內(nèi)存元組中提取列值。變量natts的值針對查詢中的特定關(guān)系是不變的,該值是需要從元組中提取的列值的數(shù)量。基于cpu性能分析和程序分析,所述sdt_loop函數(shù)識別為所述數(shù)據(jù)庫查詢執(zhí)行引擎中jit編譯的候選。所述函數(shù)中的變量natts也識別為針對查詢中特定關(guān)系的編譯后的ir中的參數(shù),在查詢執(zhí)行時natts的值保持不變。將所述函數(shù)靜態(tài)編譯成增加了參數(shù)natts的ir,如下所示:
definevoid@sdt_loop(i32%natts,i64*%values){
entry:
%cmp4=icmpsgti32%natts,0
bri1%cmp4,label%for.body,label%for.end
for.body:
%indvars.iv=phii64[%indvars.iv.next,%for.body],[0,%entry]
%arrayidx=getelementptrinboundsi64*%values,i64%indvars.iv
%rhs_val=...;computethevalue
storei64%rhs_val,i64*%arrayidx,align8
%indvars.iv.next=addi64%indvars.iv,1
%lftr.wideiv=trunci64%indvars.iv.nexttoi32
%exitcond=icmpeqi32%lftr.wideiv,%natts
bri1%exitcond,label%for.end,label%for.body
for.end:
retvoid
}.
上述參數(shù)化ir保存在為postgresql的查詢執(zhí)行引擎中的jit編譯加載的目錄表中。在一種場景下,接收查詢,其中natts等于3,如下所示:
從t中選擇計數(shù)(*),其中c3>0;
在上述示例中,c3是表格t中的第三列。
因此所述參數(shù)化ir從目錄表加載,在ir中利用常數(shù)3替代所述參數(shù)natts的引用,如下所示:
definevoid@sdt_loop(i32%natts,i64*%values){
entry:
%cmp4=icmpsgti323,0
bri1%cmp4,label%for.body,label%for.end
for.body:
%indvars.iv=phii64[%indvars.iv.next,%for.body],[0,%entry]
%arrayidx=getelementptrinboundsi64*%values,i64%indvars.iv
%rhs_val=...;computethevalue
storei64%rhs_val,i64*%arrayidx,align8
%indvars.iv.next=addi64%indvars.iv,1
%lftr.wideiv=trunci64%indvars.iv.nexttoi32
%exitcond=icmpeqi32%lftr.wideiv,3
bri1%exitcond,label%for.end,label%for.body
for.end:
retvoid
}.
上述llvmir等效于下面的c代碼:
sdt_loop(intnatts,datum*values)
{
inti;
for(i=0;i<3;i++){
values[i]=…
}
}.
然后對所述函數(shù)進行jit編譯,并且生成用于執(zhí)行該查詢的本地機器代碼。利用生成的優(yōu)化代碼對所述sdt_loop函數(shù)進行jit編譯變成:
definevoid@sdt_loop(i32%natts,i64*%values){
entry:
%rhs_val.0=...;computethefirstvalue
storei64%rhs_val.0,i64*%values,align8
%arrayidx.1=getelementptrinboundsi64*%values,i641
%rhs_val.1=...;computethesecondvalue
storei64%rhs_val.1,i64*%arrayidx.1,align8
%arrayidx.2=getelementptrinboundsi64*%values,i642
%rhs_val.2=...;computethethirdvalue
storei64%rhs_val.2,i64*%arrayidx.2,align8
retvoid
}.
等效的c代碼是:
不失一般性,上述方法可以應(yīng)用于數(shù)據(jù)庫查詢執(zhí)行引擎中的其他cpu密集函數(shù),例如哈希連接、按組排序或者合并、建立索引或其它。在該方法中,程序分析可以用于識別jit編譯的候選函數(shù)中的參數(shù)。如果變量的值對于特定查詢(查詢特定信息)是不變的,并且用常數(shù)替代所述變量期望引進針對所述函數(shù)更多的編譯器優(yōu)化,例如不可達代碼去除、循環(huán)展開、常量折疊和傳播、內(nèi)聯(lián)的虛函數(shù)調(diào)用或者通過函數(shù)指針進行調(diào)用,則該變量是用于jit編譯的函數(shù)的ir中的參數(shù)。查詢特定信息可以從查詢中關(guān)系的模式信息(例如表格、視圖或者索引)中識別,或者從查詢中表達式和數(shù)據(jù)類型中識別。例如,在上述sdt_loop函數(shù)中,在基于查詢中的模式信息和訪問列執(zhí)行之前,可以針對特定查詢確定變量natts的值。例如,notnull等部分模式信息可以有利于去除不可達代碼(查詢中notnull列的null值檢查是多余的)。(模式或者查詢本身的)數(shù)據(jù)類型信息可以有利于為函數(shù)指針或者虛擬函數(shù)解決函數(shù)。
在一實施例中,可以實現(xiàn)兩種方法中的任意一種以將查詢特定信息(常數(shù)值)添加至參數(shù)化ir。如上述sdt_loop函數(shù)的示例所示,第一種方法包括利用與特定查詢相關(guān)的常數(shù)值替代每個參數(shù)的引用。從目錄表中加載ir時,也可以獲得參數(shù)的數(shù)量以及這些參數(shù)在ir中的姓名。解析所述ir,以利用相關(guān)常數(shù)值替代任意指令中參數(shù)的引用。第二種方法包括:在函數(shù)的開始部分,針對每個參數(shù)插入賦值語句,以下以sdt_loop函數(shù)作為示例:
然后jit編譯器利用常數(shù)值替代所述參數(shù)的引用。所述llvmir是靜態(tài)單一指派形式(staticsingleassignmentform,簡稱ssa形式),并且在llvmir中沒有分配指令。同樣地,所述加法指令可以用于將所述常數(shù)加0作為分配給參數(shù)變量的常數(shù)。生成的代碼變成:
definevoid@sdt_loop(i32%natts1,i64*%values){
entry:
%natts=addi320,3;assignthevalue3tonatts
%cmp4=icmpsgti32%natts,0
bri1%cmp4,label%for.body,label%for.end
for.body:
%indvars.iv=phii64[%indvars.iv.next,%for.body],[0,%entry]
%arrayidx=getelementptrinboundsi64*%values,i64%indvars.iv
%rhs_val=...;computethevalue
storei64%rhs_val,i64*%arrayidx,align8
%indvars.iv.next=addi64%indvars.iv,1
%lftr.wideiv=trunci64%indvars.iv.nexttoi32
%exitcond=icmpeqi32%lftr.wideiv,%natts
bri1%exitcond,label%for.end,label%for.body
for.end:
retvoid
}.
所述jit編譯可以應(yīng)用于函數(shù),以生成優(yōu)化的機器代碼并返回jit編譯后的函數(shù)的函數(shù)指針。在一種場景下,cpu密集函數(shù)可以只包括cpu密集型的且有特定查詢信息的相對較少的的代碼(例如循環(huán)次數(shù)相對較少的多次迭代)。但是,相同函數(shù)中的其他代碼可以不是cpu密集型的或者可以沒有特定查詢信息。在這種情況下,為了減少jit編譯的成本,cpu密集型的和特定查詢部分的代碼可以脫離初始函數(shù),并針對此部分構(gòu)造新函數(shù)。然后,對新構(gòu)造的相對較小的函數(shù)而不是初始大函數(shù)進行jit編譯。
圖4為一種可用于實現(xiàn)包括上述方法在內(nèi)的各種實施例的處理系統(tǒng)400的方框圖。所述處理系統(tǒng)400可以是數(shù)據(jù)庫管理系統(tǒng)或者數(shù)據(jù)庫查詢執(zhí)行引擎的一部分。特定設(shè)備可利用所有所示的部件或所述部件的僅一子集,且設(shè)備之間的集成程度可能不同。此外,設(shè)備可以包括部件的多個實例,例如多個處理單元、處理器、存儲器、發(fā)射器、接收器等。所述處理系統(tǒng)400可以包括配備一個或者多個輸入/輸出設(shè)備,例如揚聲器、麥克風(fēng)、鼠標(biāo)、觸摸屏、按鍵、鍵盤、打印機、顯示器等的處理單元401。所述處理單元401可以包括連接到總線的中央處理器(centralprocessingunit,簡稱cpu)410、存儲器420、大容量存儲設(shè)備430、視頻適配器440以及i/o接口460。所述總線可以為任何類型的幾個總線架構(gòu)中的一個或多個,包括存儲總線或者存儲控制器、外設(shè)總線或者視頻總線等等。
所述cpu410可以包括任意類型的電子數(shù)據(jù)處理器。所述存儲器420可以包括任意類型的系統(tǒng)存儲器,例如靜態(tài)隨機存取存儲器(staticrandomaccessmemory,簡稱sram)、動態(tài)隨機存取存儲器(dynamicrandomaccessmemory,簡稱dram)、同步dram(synchronousdynamicrandomaccessmemory,簡稱sdram)、只讀存儲器(read-onlymemory,簡稱rom)或其組合等等。在一實施例中,所述存儲器420可以包括開機時使用的rom以及在執(zhí)行程序時使用的存儲程序和數(shù)據(jù)的dram。在一實施例中,所述存儲器420是非瞬時的。所述大容量存儲設(shè)備430可以包括任意類型的存儲設(shè)備,其用于存儲數(shù)據(jù)、程序和其它信息,并使這些數(shù)據(jù)、程序和其它信息可以通過總線訪問。所述大容量存儲設(shè)備430可以包括如下項中的一種或多種:固態(tài)磁盤、硬盤驅(qū)動器、磁盤驅(qū)動器以及光盤驅(qū)動器等等。
所述視頻適配器440和所述i/o接口460提供接口,以將外部輸入和輸出設(shè)備耦合到所述處理單元。如圖所示,輸入輸出設(shè)備的示例包括耦合至所述視頻適配器440的顯示器490和耦合至所述i/o接口460的鼠標(biāo)/鍵盤/打印機470的任意組合。其它設(shè)備可以耦合至所述處理單元401,并且可以利用附加的或更少的接口卡。例如,串行接口卡(未圖示)可以用于為打印機提供串行接口。
所述處理單元401還包括一個或多個網(wǎng)絡(luò)接口450,所述網(wǎng)絡(luò)接口450可以包括以太網(wǎng)電纜等有線鏈路,和/或到接入節(jié)點或者一個或多個網(wǎng)絡(luò)480的無線鏈路。所述網(wǎng)絡(luò)接口450允許所述處理單元401通過所述網(wǎng)絡(luò)480與遠端單元通信。例如,所述網(wǎng)絡(luò)接口450可以通過一個或多個發(fā)射器/發(fā)射天線以及一個或多個接收器/接收天線提供無線通信。在一實施例中,所述處理單元401耦合到局域網(wǎng)或廣域網(wǎng)上用于數(shù)據(jù)處理以及與遠端設(shè)備通信,其中所述遠端設(shè)備是其它處理單元、因特網(wǎng)、遠端存儲設(shè)施等等。
在一示例性的實施例中,數(shù)據(jù)庫管理系統(tǒng)包括:cpu識別模塊,用于識別查詢中的中央處理器(centralprocessingunit,簡稱cpu)密集函數(shù);參數(shù)識別模塊,用于在所述cpu密集函數(shù)中識別一個或者多個參數(shù),其中所述一個或者多個參數(shù)代表在不同查詢實例中可以變化的值的變量;編譯模塊,用于將所述cpu密集函數(shù)編譯成包括所述一個或者多個參數(shù)的參數(shù)化中間表示(intermediaterepresentation,簡稱ir);以及保存模塊,用于將所述cpu密集函數(shù)的參數(shù)化ir保存在參數(shù)化ir的目錄中。在部分實施例中,所述數(shù)據(jù)庫管理系統(tǒng)可以包括其他或者附加模塊用于執(zhí)行所述實施例中描述的任一或組合的步驟。
在一示例性的實施例中,數(shù)據(jù)庫管理系統(tǒng)包括:cpu編譯模塊,用于將中央處理器(centralprocessingunit,簡稱cpu)密集函數(shù)編譯成包括一個或者多個參數(shù)的參數(shù)化中間表示(intermediaterepresentation,簡稱ir),其中所述一個或者多個參數(shù)代表在不同的查詢實例中可以變化的的值的變量;保存模塊,用于將所述cpu密集函數(shù)的參數(shù)化ir保存在參數(shù)化ir的目錄中;加載模塊,用于在準(zhǔn)備執(zhí)行傳入查詢時,從所述目錄加載參數(shù)化ir;替代模塊,用于在所述參數(shù)化ir中利用所述傳入查詢的變量的常數(shù)值替代所述一個或者多個參數(shù);參數(shù)化ir編譯模塊,用于通過所述jit編譯利用替代所述一個或者多個參數(shù)的常數(shù)值編譯所述參數(shù)化ir,以生成用于執(zhí)行所述傳入查詢的機器代碼。在部分實施例中,所述數(shù)據(jù)庫管理系統(tǒng)可以包括其他或者附加模塊用于執(zhí)行所述實施例中描述的任一或組合的步驟。
雖然本發(fā)明中已提供若干實施例,但應(yīng)理解,在不脫離本發(fā)明的精神或范圍的情況下,本發(fā)明所公開的系統(tǒng)和方法可以以許多其他特定形式來體現(xiàn)。本發(fā)明的實例應(yīng)被視為說明性而非限制性的,且本發(fā)明并不限于本文本所給出的細(xì)節(jié)。例如,各種元件或部件可以在另一系統(tǒng)中組合或合并,或者某些特征可以省略或不實施。
此外,在不脫離本發(fā)明的范圍的情況下,各種實施例中描述和說明為離散或單獨的技術(shù)、系統(tǒng)、子系統(tǒng)和方法可以與其它系統(tǒng)、模塊、技術(shù)或方法進行組合或合并。展示或論述為彼此耦合或直接耦合或通信的其它項也可以采用電方式、機械方式或其它方式通過某一接口、設(shè)備或中間部件間接地耦合或通信。其他變化、替代和改變的示例可以由本領(lǐng)域的技術(shù)人員在不脫離本文精神和所公開的范圍的情況下確定。