數(shù)據(jù)庫查詢方法和服務(wù)器的制造方法
【專利摘要】本發(fā)明實(shí)施例提供一種列式內(nèi)存數(shù)據(jù)庫查詢的方法,包括:接收查詢請求;解析查詢查詢請求,獲得查詢條件;從列式內(nèi)存數(shù)據(jù)庫中,確定與查詢條件相關(guān)的目標(biāo)列;循環(huán)執(zhí)行以下步驟,直到完成所有行的查詢:從查詢各個目標(biāo)列的第m*(i-1)+1行開始,將列式內(nèi)存數(shù)據(jù)庫中的查詢各個目標(biāo)列中連續(xù)m行的數(shù)據(jù)或最后少于m行的數(shù)據(jù)存儲到緩存Cache,根據(jù)查詢查詢條件,查詢查詢Cache存儲的數(shù)據(jù),發(fā)送分段查詢結(jié)果,釋放查詢Cache的存儲空間,其中m是一個自然常數(shù),i是變量,表示已經(jīng)循環(huán)執(zhí)行的次數(shù)。采用本發(fā)明的方法降低了查詢過程中的數(shù)據(jù)溢出,減少了數(shù)據(jù)查詢的時(shí)延。
【專利說明】數(shù)據(jù)庫查詢方法和服務(wù)器
【技術(shù)領(lǐng)域】
[0001 ] 本發(fā)明實(shí)施例涉及數(shù)據(jù)庫技術(shù),尤其涉及一種數(shù)據(jù)庫查詢方法和服務(wù)器。
【背景技術(shù)】
[0002]緩存Cache是位于CPU與內(nèi)存RAM之間的臨時(shí)存儲器,它的容量比內(nèi)存小但交換速度快。當(dāng)CPU調(diào)用大量數(shù)據(jù)時(shí),可直接從Cache中調(diào)用,從而加快讀取速度。通常經(jīng)常下,Cache分為L1、L2、L3幾個級別,LI是單CPU的單核獨(dú)占使用空間,L2是單CPU的多核共享使用的空間,L3是多個CPU多核共享使用的空間,例如:L1、L2、L3的Cache的大小分別為32K、512K和15360Κ。以每次讀取256Byte為例,3個CACHE的時(shí)延分別為:1.2ns、4ns和30ns。而在內(nèi)存RAM中數(shù)據(jù)讀取需要100ns。相同指令情況下,數(shù)據(jù)在不同的位置,需要的時(shí)間相差數(shù)倍或數(shù)十倍。雖然各個廠家的芯片不盡相同,但時(shí)延相差的倍數(shù)基本一致。
[0003]列式內(nèi)存數(shù)據(jù)庫是指數(shù)按列組織存儲的數(shù)據(jù)庫,每個列的數(shù)據(jù)獨(dú)立緊密存放,這種存放組織方式特別適合分析場景下對大量數(shù)據(jù)的少數(shù)列查詢,查詢時(shí),系統(tǒng)僅讀取需要處理的列,而不讀入全部數(shù)據(jù)列。
[0004]當(dāng)前的列式處理是按列分解條件,查詢時(shí),每個列單獨(dú)查詢,而后把符合條件的記錄行合并求交集,取得最終結(jié)果的。例如,SELECT COUNT (*),SUM (v.SALARY) FROM (SELECTAGE, SALARY, CITY, JOB FROM T WHERE AGE>24AND SALARY>5000AND CITY =’SHENZHEN’ANDJOB =,SALE’ );列式內(nèi)存數(shù)據(jù)庫執(zhí)行這個SQL時(shí)通常分解為以下幾步:
[0005]I,掃描AGE列符合AGE>24條件的記錄行號集合和數(shù)據(jù)集;
[0006]2,掃描SALARY列符合SALARY>5000條件的記錄行號集合和數(shù)據(jù)集;
[0007]3,掃描CITY列符合CITY =’ SHENZHEN’條件的記錄行號集合和數(shù)據(jù)集;
[0008]4,掃描JOB列符合JOB =’ SALE’條件的記錄行號集合和數(shù)據(jù)集;
[0009]5,對AGE、SALARY、CITY、JOB的行號集合求交集,得到一個條件都滿足的最終行號集合;
[0010]6,統(tǒng)計(jì)最終的行號集合,掃描中間結(jié)果得到COUNT和SUM結(jié)果。
[0011]以上每個步驟,尤其是掃描列時(shí),會產(chǎn)生大量的行號集合和數(shù)據(jù)集合這些中間數(shù)據(jù),由于Cache的容量有限,可能會導(dǎo)致Cache無法保存這些數(shù)據(jù),那就不得不將這些中間數(shù)據(jù)溢出到RAM中。如果后續(xù)對中間數(shù)據(jù)進(jìn)一步運(yùn)算時(shí),則需要將這些中間數(shù)據(jù)從RAM中取出并計(jì)算,那么從RAM讀取數(shù)據(jù)的過程將產(chǎn)生較大時(shí)延,如果計(jì)算變復(fù)雜,時(shí)延就會呈倍數(shù)增加。
【發(fā)明內(nèi)容】
[0012]本發(fā)明實(shí)施例提供一種數(shù)據(jù)庫查詢方法和服務(wù)器,減少了數(shù)據(jù)庫查詢過程的時(shí)延。
[0013]第一方面,本發(fā)明提供了一種數(shù)據(jù)庫查詢方法,包括:接收查詢請求;解析查詢請求,獲得查詢條件;從列式內(nèi)存數(shù)據(jù)庫中,確定與查詢條件相關(guān)的目標(biāo)列;循環(huán)執(zhí)行以下步驟,直到完成所有行的查詢:從各個目標(biāo)列的第m*(1-l)+l行開始,將列式內(nèi)存數(shù)據(jù)庫中的各個目標(biāo)列中連續(xù)m行的數(shù)據(jù)或最后少于m行的數(shù)據(jù)存儲到緩存Cache,根據(jù)查詢條件,查詢Cache存儲的數(shù)據(jù),發(fā)送分段查詢結(jié)果,釋放Cache的存儲空間,其中m是一個自然常數(shù),i是變量,表示已經(jīng)循環(huán)執(zhí)行的次數(shù)。
[0014]結(jié)合第一方面,在第一方面的第一種可能的實(shí)現(xiàn)方式中,該方法還包括:當(dāng)查詢最后的m行或者少于m行的數(shù)據(jù)時(shí),在發(fā)送的分段查詢結(jié)果中還包含查詢結(jié)束標(biāo)識,以通知請求者本次查詢請求已經(jīng)完成。
[0015]結(jié)合第一方面的第一種可能,在第一方面的第二種可能的實(shí)現(xiàn)方式中,該方法還包括:請求者接收各個分段查詢結(jié)果后,存儲各個分段查詢結(jié)果,當(dāng)接收到查詢結(jié)束標(biāo)識后,組合各個分段查詢結(jié)果,并將組合后的查詢結(jié)果作為最終查詢結(jié)果。
[0016]結(jié)合第一方面的第一種可能,在第一方面的第三種可能的實(shí)現(xiàn)方式中,當(dāng)將從列式內(nèi)存數(shù)據(jù)庫中的目標(biāo)列某行的數(shù)據(jù)存儲到cache中時(shí),在列式內(nèi)存數(shù)據(jù)庫中獲取到目標(biāo)列的末行標(biāo)識或者無法獲取到目標(biāo)列的下一行的地址或者指針時(shí),則生成查詢結(jié)束標(biāo)識。
[0017]第二方面,本發(fā)明提供了一種數(shù)據(jù)庫查詢服務(wù)器,包括,接收模塊,解析模塊、確定模塊和查詢模塊,其中:接收模塊,用于接收請求者發(fā)送的查詢請求,查詢請求包含查詢條件,并將查詢請求發(fā)送到解析模塊上;解析模塊,用于接收接收模塊發(fā)送到的查詢請求,并解析查詢請求,獲得查詢條件,將查詢條件發(fā)送到確定模塊和查詢模塊上;確定模塊,用于接收解析模塊發(fā)送到的查詢條件,并從列式內(nèi)存數(shù)據(jù)庫中,確定與查詢條件相關(guān)的目標(biāo)列;和查詢模塊,用于循環(huán)執(zhí)行以下步驟,直到完成所有行的查詢:從各個目標(biāo)列的第m*(i_l)+l行開始,將列式內(nèi)存數(shù)據(jù)庫中的各個目標(biāo)列中連續(xù)m行的數(shù)據(jù)或最后少于m行的數(shù)據(jù)存儲到緩存Cache,根據(jù)查詢條件,查詢Cache存儲的數(shù)據(jù),發(fā)送分段查詢結(jié)果和釋放Cache的存儲空間,其中m是一個自然常數(shù),i是變量,表示已經(jīng)循環(huán)執(zhí)行的次數(shù)。
[0018]結(jié)合第二方面,在第二方面的第一種可能的實(shí)現(xiàn)方式中,該查詢模塊,具體用于當(dāng)查詢最后的m行或者少于m行的數(shù)據(jù)時(shí),發(fā)送包含查詢結(jié)束標(biāo)識的分段查詢結(jié)果,以通知請求者本次查詢請求已經(jīng)完成。
[0019]結(jié)合第二方面,在第二方面的第二種可能的實(shí)現(xiàn)方式中,數(shù)據(jù)庫查詢服務(wù)器還包括:生成模塊,用于當(dāng)將從列式內(nèi)存數(shù)據(jù)庫中的目標(biāo)列某行的數(shù)據(jù)存儲到cache中時(shí),在列式內(nèi)存數(shù)據(jù)庫中獲取到目標(biāo)列的末行標(biāo)識或者無法獲取到目標(biāo)列的下一行的地址或者指針時(shí),生成查詢結(jié)束標(biāo)識。
[0020]第三方面,本發(fā)明提供了列式內(nèi)存數(shù)據(jù)庫查詢的方法,方法包括:
[0021]接收查詢請求;解析查詢請求,獲得查詢條件;從列式內(nèi)存數(shù)據(jù)庫中,確定與查詢條件相關(guān)的目標(biāo)列;循環(huán)執(zhí)行以下步驟,直到完成所有行的查詢:從各個目標(biāo)列的第m*(i_l)+l行開始,將列式內(nèi)存數(shù)據(jù)庫中的各個目標(biāo)列中連續(xù)m行的數(shù)據(jù)或者最后少于m行的數(shù)據(jù)存儲到緩存Cache,根據(jù)查詢條件,查詢Cache存儲的數(shù)據(jù),在臨時(shí)存儲模塊中存儲分段查詢結(jié)果,釋放Cache的存儲空間,其中m是一個自然常數(shù),i為變量,表示已經(jīng)循環(huán)執(zhí)行的次數(shù);當(dāng)查詢條件相關(guān)的目標(biāo)列的數(shù)據(jù)均被查詢后,組合臨時(shí)存儲模塊中的各個分段查詢結(jié)果,將組合后的查詢結(jié)果作為最終查詢結(jié)果,發(fā)送最終查詢結(jié)果。
[0022]結(jié)合第三方面,在第三方面的第一種可能的實(shí)現(xiàn)方式中,方法還包括:當(dāng)將從列式內(nèi)存數(shù)據(jù)庫中的目標(biāo)列某行的數(shù)據(jù)存儲到cache中,在列式內(nèi)存數(shù)據(jù)庫中獲取到目標(biāo)列的末行標(biāo)識,或者無法獲取到目標(biāo)列的下一行的地址或者指針時(shí),生成查詢結(jié)束標(biāo)識,以通知臨時(shí)存儲模塊組合臨時(shí)存儲模塊中的各個分段查詢結(jié)果。
[0023]第四方面,本發(fā)明提供了數(shù)據(jù)庫查詢服務(wù)器,包括,接收模塊,解析模塊、確定模塊、查詢模塊和臨時(shí)存儲模塊,其中:接收模塊,用于接收請求者發(fā)送的查詢請求,查詢請求包含查詢條件,并將查詢請求發(fā)送到解析模塊上;解析模塊,用于接收接收模塊發(fā)送到的查詢請求,并解析查詢請求,獲得查詢條件,將查詢條件發(fā)送到確定模塊和查詢模塊上;確定模塊,用于接收解析模塊發(fā)送到的查詢條件,并從列式內(nèi)存數(shù)據(jù)庫中,確定與查詢條件相關(guān)的目標(biāo)列;和查詢模塊,用于循環(huán)執(zhí)行以下步驟,直到完成所有行的查詢:從各個目標(biāo)列的第行開始,將列式內(nèi)存數(shù)據(jù)庫中的各個目標(biāo)列中連續(xù)m行的數(shù)據(jù)或最后少于m行的數(shù)據(jù)存儲到緩存Cache,根據(jù)查詢條件,查詢Cache存儲的數(shù)據(jù),在臨時(shí)存儲模塊中存儲分段查詢結(jié)果,釋放Cache的存儲空間,其中m是一個自然常數(shù),i是變量,表示已經(jīng)循環(huán)執(zhí)行的次數(shù);臨時(shí)存儲模塊,用于存儲循環(huán)執(zhí)行過程中的分段查詢結(jié)果,當(dāng)查詢條件相關(guān)的目標(biāo)列的數(shù)據(jù)均被查詢后,組合臨時(shí)存儲模塊中的各個分段查詢結(jié)果,將組合后的查詢結(jié)果作為最終查詢結(jié)果,發(fā)送最終查詢結(jié)果。
[0024]結(jié)合第四方面,在第四方面的第一種可能的實(shí)現(xiàn)方式中,數(shù)據(jù)庫查詢服務(wù)器,還包括:生成模塊,用于當(dāng)將從列式內(nèi)存數(shù)據(jù)庫中的目標(biāo)列某行的數(shù)據(jù)存儲到cache中,在列式內(nèi)存數(shù)據(jù)庫中獲取到目標(biāo)列的末行標(biāo)識,或者無法獲取到目標(biāo)列的下一行的地址或者指針時(shí),生成查詢結(jié)束標(biāo)識,以通知臨時(shí)存儲模塊組合臨時(shí)存儲模塊中的各個分段查詢結(jié)果。
[0025]本發(fā)明的實(shí)施例中,由于查詢的數(shù)據(jù)都是一段一段來查詢的,因此在查詢過程中產(chǎn)生的數(shù)據(jù)以及查詢的數(shù)據(jù)都只可以存儲在Cache中,并沒有溢出到RAM中,因此降低了查詢過程中的數(shù)據(jù)溢出,減少了數(shù)據(jù)查詢的時(shí)延。
【專利附圖】
【附圖說明】
[0026]為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0027]圖1為本發(fā)明實(shí)施例的數(shù)據(jù)庫查詢方法的流程示意圖;
[0028]圖2為本發(fā)明實(shí)施例的數(shù)據(jù)庫查詢另一種方法的流程示意圖;
[0029]圖3為本發(fā)明實(shí)施例的數(shù)據(jù)庫查詢方法的一個查詢過程的示意圖;
[0030]圖4為本發(fā)明實(shí)施例的數(shù)據(jù)庫查詢服務(wù)器的結(jié)構(gòu)示意圖;
[0031]圖5為本發(fā)明實(shí)施例的又一個數(shù)據(jù)庫查詢服務(wù)器的結(jié)構(gòu)示意圖;
[0032]圖6為本發(fā)明實(shí)施例的又一個數(shù)據(jù)庫查詢服務(wù)器的結(jié)構(gòu)示意圖;
[0033]圖7為本發(fā)明實(shí)施例的又一個數(shù)據(jù)庫查詢服務(wù)器的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0034]為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。[0035]圖1為本發(fā)明數(shù)據(jù)庫查詢方法實(shí)施例的流程圖,該方法應(yīng)用在列式內(nèi)存數(shù)據(jù)庫中,列式內(nèi)存數(shù)據(jù)庫的列式數(shù)據(jù)是存儲在內(nèi)存中的,該方法包括:
[0036]步驟101:接收查詢請求。
[0037]而外部設(shè)備可以直接向數(shù)據(jù)庫查詢服務(wù)器發(fā)送查詢請求,此時(shí)請求者為外部設(shè)備,外部設(shè)備也可以通過代理裝置向數(shù)據(jù)庫查詢服務(wù)器發(fā)送查詢請求,此時(shí)請求者為代理裝置,該代理裝置可以位于數(shù)據(jù)庫查詢服務(wù)器中,也可以位于數(shù)據(jù)庫查詢服務(wù)器之外,該查詢請求包含了查詢條件。
[0038]步驟102:解析查詢請求,獲得查詢條件。
[0039]數(shù)據(jù)庫查詢服務(wù)器根據(jù)查詢請求,獲得查詢條件,這個查詢條件可能是一個SQL語句,如:SELECT NAME FROM DETAIL_REC0RD WHERE FEE> 100AND AGE>18。
[0040]步驟103:從列式內(nèi)存數(shù)據(jù)庫中,確定與查詢條件相關(guān)的目標(biāo)列;
[0041]查詢條件涉及到的列就是為目標(biāo)列,例如:查詢條件中“FEE>100ANDAGE>18”涉及到兩個列,F(xiàn)EE列和AGE列,那么這兩個列就是查詢條件相關(guān)的目標(biāo)列。
[0042]步驟104:循環(huán)執(zhí)行以下步驟,直到完成所有行的查詢:從各個目標(biāo)列的第m*(i_l)+l行開始,將列式內(nèi)存數(shù)據(jù)庫中的各個目標(biāo)列中連續(xù)m行的數(shù)據(jù)或最后少于m行的數(shù)據(jù)存儲到Cache,根據(jù)所述查詢條件,查詢Cache存儲的數(shù)據(jù),發(fā)送分段查詢結(jié)果和釋放所述Cache的存儲空間,其中m為自然常數(shù),m表示每次查詢目標(biāo)列的行數(shù),m為1000-10000,特別可以取8192行,i是變量,表示已經(jīng)循環(huán)執(zhí)行的次數(shù),比如第一次循環(huán)執(zhí)行時(shí)i為I,第二次循環(huán)執(zhí)行時(shí),i為2。
[0043]圖2為本發(fā)明數(shù)據(jù)庫查詢方法實(shí)施例的流程圖,該方法應(yīng)用在列式內(nèi)存數(shù)據(jù)庫中,列式內(nèi)存數(shù)據(jù)庫的列式數(shù)據(jù)是存儲在內(nèi)存中的,該方法包括:
[0044]步驟201-203與步驟101-103相同。
[0045]步驟204:循環(huán)執(zhí)行以下步驟,直到完成所有行的查詢:從所述各個目標(biāo)列的第m*(i_l)+l行開始,將列式內(nèi)存數(shù)據(jù)庫中的所述各個目標(biāo)列中連續(xù)m行的數(shù)據(jù)或者最后少于m行的數(shù)據(jù)存儲到緩存Cache,根據(jù)所述查詢條件,查詢所述Cache存儲的數(shù)據(jù),在臨時(shí)存儲模塊中存儲分段查詢結(jié)果,釋放所述Cache的存儲空間,其中m是一個自然常數(shù),m表示每次查詢目標(biāo)列的行數(shù),i為變量,表示已經(jīng)循環(huán)執(zhí)行的次數(shù);
[0046]步驟205:當(dāng)所述查詢條件相關(guān)的目標(biāo)列的數(shù)據(jù)均被查詢后,組合臨時(shí)存儲模塊中的各個分段查詢結(jié)果,將組合后的查詢結(jié)果作為最終查詢結(jié)果,發(fā)送所述最終查詢結(jié)果。
[0047]例如:上述步驟102中的SQL語句,需要查詢兩列,F(xiàn)EE列和AGE列,而根據(jù)預(yù)先的設(shè)定,每次查詢目標(biāo)列的行數(shù)為8192行,即m為8192,,則首先將列式內(nèi)存數(shù)據(jù)庫中FEE列第一個連續(xù)8192行的數(shù)據(jù)存儲到Cache,并根據(jù)查詢條件和Cache存儲的該8192行的數(shù)據(jù),進(jìn)行運(yùn)算,獲得第一個中間運(yùn)算結(jié)果,并將該第一中間運(yùn)算結(jié)果存儲在Cache中。然后將列式內(nèi)存數(shù)據(jù)庫中AGE列第一個連續(xù)8192行的數(shù)據(jù)存儲到Cache,并根據(jù)查詢條件和Cache存儲的該8192行的數(shù)據(jù),進(jìn)行運(yùn)算,獲得第二個中間運(yùn)算結(jié)果,并將該第二中間運(yùn)算結(jié)果存儲在Cache中。各個中間運(yùn)算結(jié)果可以是一個位圖。
[0048]接著,再根據(jù)查詢條件、第一個中間運(yùn)算結(jié)果和第二個中間運(yùn)算結(jié)果,進(jìn)行運(yùn)算,獲得本次查詢的分段查詢結(jié)果,然后向請求者或者向臨時(shí)存儲模塊發(fā)送分段查詢結(jié)果,釋放Cache的存儲空間,這樣可以騰出Cache的空間,以進(jìn)行下一次分段查詢。[0049]執(zhí)行下i次分段查詢時(shí),第8192*(i_l)+l行開始,從列式內(nèi)存數(shù)據(jù)庫中讀入目標(biāo)列中的連續(xù)8192行的數(shù)據(jù)到Cache中,中間運(yùn)算和取得查詢的結(jié)果的方式,每一次循環(huán)執(zhí)行都是相同的。從列式內(nèi)存數(shù)據(jù)庫讀取某行的數(shù)據(jù)的方式可以有多種,比如:在讀取某行數(shù)據(jù)時(shí),會得到該行的下一行數(shù)據(jù)指針或者地址,也就是說如果執(zhí)行第i次分段查詢時(shí),就從第i_l次分段查詢的最后一行讀取過程中,獲取該第i次分段查詢的第一行的指針或者地址,然后獲取到的該第i次分段查詢的第一行的指針或者地址?;蛘呙啃卸加幸粋€行號,需要讀取哪一行,就通過行號來讀取。
[0050]當(dāng)各個目標(biāo)列中未被查詢行的行數(shù)少于m(8192)行時(shí),則將列式內(nèi)存數(shù)據(jù)庫中FEE列最后未被查詢行的數(shù)據(jù)存儲到Cache,并根據(jù)查詢條件和Cache存儲的該最后未被查詢行的數(shù)據(jù),進(jìn)行運(yùn)算,獲得本次查詢的第一個中間運(yùn)算結(jié)果,并將本次查詢的第一中間運(yùn)算結(jié)果存儲在Cache中。然后將列式內(nèi)存數(shù)據(jù)庫中AGE列最后未被查詢行的數(shù)據(jù)存儲到Cache,并根據(jù)查詢條件和Cache存儲的最后未被查詢行的數(shù)據(jù),進(jìn)行運(yùn)算,獲得本次查詢的第二個中間運(yùn)算結(jié)果,并將本次查詢的該第二中間運(yùn)算結(jié)果存儲在Cache中。再根據(jù)查詢條件、本次查詢的第一個中間運(yùn)算結(jié)果和本次查詢的第二個中間運(yùn)算結(jié)果,進(jìn)行運(yùn)算,獲得本次查詢的分段查詢結(jié)果,然后向請求者或者向臨時(shí)存儲模塊發(fā)送分段查詢結(jié)果,釋放Cache的存儲空間。
[0051]當(dāng)將從列式內(nèi)存數(shù)據(jù)庫中的目標(biāo)列某行的數(shù)據(jù)存儲到cache中時(shí),在列式內(nèi)存數(shù)據(jù)庫中獲取到所述目標(biāo)列的末行標(biāo)識或者無法獲取到所述目標(biāo)列的下一行的地址或者指針時(shí),則生成查詢結(jié)束標(biāo)識。在查詢過程中,有多種方式判斷查詢的一行是否為最后一行,例如:如果事先知道目標(biāo)列的行數(shù),這樣通過在查詢過程中統(tǒng)計(jì)已經(jīng)查詢的行數(shù),從而獲知查詢的一行是否為最后一行,結(jié)束查詢?;蛘撸鱾€列中的最后一行有一個末行標(biāo)識,該末行標(biāo)識指示該行是本列的最后一行,因此在查詢過程中,在列式內(nèi)存數(shù)據(jù)庫中獲得該末行標(biāo)識時(shí),就可以獲知該行是最后一行,結(jié)束查詢?;蛘撸诓樵兠恳恍械耐瑫r(shí),將會獲得下一行的指針或者地址,如果查詢一行時(shí),在列式內(nèi)存數(shù)據(jù)庫中不能獲得下一行的指針或者地址時(shí),則表示查詢的該行為最后一行,結(jié)束查詢。
[0052]數(shù)據(jù)庫查詢服務(wù)器可以將每一個分段查詢結(jié)果直接發(fā)送給外部設(shè)備或代理裝置,如果直接發(fā)送給代理裝置的話,代理裝置可以直接將每一個分段查詢結(jié)果直接發(fā)送給外部設(shè)備,代理裝置也可以先存儲各個分段查詢結(jié)果,當(dāng)接收到查詢結(jié)束標(biāo)志時(shí),根據(jù)查詢結(jié)束標(biāo)志,組合所有的分段查詢結(jié)果,并將組合后的分段查詢結(jié)果發(fā)送給外部設(shè)備。數(shù)據(jù)庫查詢服務(wù)器還可以將各個分段查詢結(jié)果存儲在數(shù)據(jù)庫查詢服務(wù)器里的臨時(shí)存儲模塊中,當(dāng)獲得查詢結(jié)束標(biāo)志,就意味著所有的分段查詢結(jié)束了,因此組合所有的分段查詢結(jié)果,并將組合后的分段查詢結(jié)果發(fā)送給請求者。
[0053]由于列式內(nèi)存數(shù)據(jù)庫的列式數(shù)據(jù)的一列存在很多行,一次性查詢所有行,會導(dǎo)致Cache的數(shù)據(jù)存儲不下,溢出RAM中,這樣會帶來查詢的時(shí)延,本發(fā)明的實(shí)施例中,由于查詢的數(shù)據(jù)都是一段一段來查詢的,因此在查詢過程中產(chǎn)生的數(shù)據(jù)以及查詢的數(shù)據(jù)都只可以存儲在Cache中,并沒有溢出到RAM中,因此降低了查詢過程中的數(shù)據(jù)溢出,減少了數(shù)據(jù)查詢的時(shí)延。
[0054]下面介紹一個例子來說明上述本發(fā)明的實(shí)施例。
[0055]數(shù)據(jù)庫查詢服務(wù)器接收請求者發(fā)送的一個SQL查詢語句,例如,該SQL查詢語句為:SELECT NAME FROM DETAIL_RECORD WHERE FEE>IOOAND AGE>18。數(shù)據(jù)庫查詢服務(wù)器處理過程,如圖3所示。
[0056]1、數(shù)據(jù)庫查詢服務(wù)器接收了 SQL語句后,解析該SQL語句,確認(rèn)該SQL語句與DETAIL_REC0RD表中的FEE列和AGE列有關(guān)。
[0057]2、數(shù)據(jù)庫查詢服務(wù)器將FEE列一個連續(xù)8192行的數(shù)據(jù)存儲到Cache,并根據(jù)表達(dá)式‘FEE>100’和Cache存儲的該8192行的數(shù)據(jù),進(jìn)行運(yùn)算,生成一張8192行的第一位圖(bitmap)。該第一位圖中符合FEE>100條件的行標(biāo)識為1,不符合FEE>100條件的行標(biāo)識為0,將第一位圖存儲在Cache中。具體的上述Cache可以為L2級別的Cache,。
[0058]在列式數(shù)據(jù)的處理中,一般的數(shù)據(jù)類型分別是BOOLEAN、INT8,INT16, INT32, INT64,DOUBLE, VARCHAR類型,最小數(shù)據(jù)類型是lbit,常用數(shù)字類型不超過8字節(jié),字符類型也就30字節(jié)以內(nèi)。因?yàn)橐粋€8字節(jié)數(shù)據(jù),8192行也就是64KB,考慮到運(yùn)算結(jié)果一個bitmap也就是8K,數(shù)據(jù)和處理中間結(jié)果都在L2級別的CACHE以內(nèi),包括程序代碼段,這樣就可以很好的利用CPU的L2級的低時(shí)延特性。
[0059]3、然后將DETAIL_REC0RD表中的AGE列第一個連續(xù)8192行的數(shù)據(jù)存儲到Cache,并根據(jù)表達(dá)式AGE>18和Cache存儲的該8192行的數(shù)據(jù),進(jìn)行運(yùn)算,生成一張8192行的第二位圖,該第二位圖中符合AGE>18條件的行標(biāo)識為1,不符合AGE>18條件的行標(biāo)識為0,并將該第二位圖存儲在Cache中。
[0060]4、接著,再根據(jù)表達(dá)式FEE>100AND AGE>18、第一位圖和第二位圖,執(zhí)行AND操作,生成一張8192行的第三位圖,并將第三位圖存儲在級別的Cache中。
[0061]5,根據(jù)上述第三位圖和表達(dá)式 SELECT NAME FROM DETAIL_REC0RD,從 DETAIL_RECORD表中提取出相應(yīng)的NAME列數(shù)據(jù),因此獲得了本次分段查詢結(jié)果,然后向請求者發(fā)送分段查詢結(jié)果和釋放Cache的存儲空間,這樣可以騰出Cache的空間,以進(jìn)行下一次分段查詢。
[0062]循環(huán)執(zhí)行上面的過程2-5,每循環(huán)執(zhí)行一次,就查詢一個segment,直至所有行都被處理完。數(shù)據(jù)庫查詢服務(wù)器在最后一條返回外部設(shè)備的消息中包含處理結(jié)束標(biāo)識。
[0063]在循環(huán)執(zhí)行上面的步驟2-5時(shí),如果是第一次執(zhí)行分段查詢,則步驟2和3中,數(shù)據(jù)庫查詢服務(wù)器將FEE列第一個連續(xù)8192行的數(shù)據(jù)存儲到Cache,如果是第i次執(zhí)行分段查詢,則步驟2和3中,數(shù)據(jù)庫查詢服務(wù)器將FEE列中未被查詢的第(i)個連續(xù)8192行的的數(shù)據(jù)存儲到Cache中。如果最后一次執(zhí)行分段查詢,則步驟2和3中,數(shù)據(jù)庫查詢服務(wù)器將FEE列中未被查詢的剩余的所有行的數(shù)據(jù)存儲到Cache中。
[0064]例如:本實(shí)施場景以10億記錄數(shù)據(jù)表數(shù)據(jù)庫查詢?yōu)槔u估數(shù)據(jù)量如下:
[0065]
【權(quán)利要求】
1.一種列式內(nèi)存數(shù)據(jù)庫查詢的方法,其特征在于,所述方法包括: 接收查詢請求; 解析所述查詢請求,獲得查詢條件; 從列式內(nèi)存數(shù)據(jù)庫中,確定與查詢條件相關(guān)的目標(biāo)列; 循環(huán)執(zhí)行以下步驟,直到完成所有行的查詢:從所述各個目標(biāo)列的第rn*(1-l)+l行開始,將列式內(nèi)存數(shù)據(jù)庫中的所述各個目標(biāo)列中連續(xù)m行的數(shù)據(jù)或最后少于m行的數(shù)據(jù)存儲到緩存Cache,根據(jù)所述查詢條件,查詢所述Cache存儲的數(shù)據(jù),發(fā)送分段查詢結(jié)果,釋放所述Cache的存儲空間,其中m是一個自然常數(shù),i是變量,表示已經(jīng)循環(huán)執(zhí)行的次數(shù)。
2.如權(quán)利要求1所述的方法,其特征在于,所述方法還包括:當(dāng)查詢最后的m行或者少于m行的數(shù)據(jù)時(shí),在發(fā)送的分段查詢結(jié)果中還包含查詢結(jié)束標(biāo)識,以通知所述請求者本次查詢請求已經(jīng)完成。
3.如權(quán)利要求2所述的方法,其特征在于,所述方法還包括:所述請求者接收各個分段查詢結(jié)果后,存儲所述各個分段查詢結(jié)果,當(dāng)接收到查詢結(jié)束標(biāo)識后,組合所述各個分段查詢結(jié)果,并將組合后 的查詢結(jié)果作為最終查詢結(jié)果。
4.如權(quán)利要求2所述的方法,其特征在于,所述方法還包括: 當(dāng)將從列式內(nèi)存數(shù)據(jù)庫中的目標(biāo)列某行的數(shù)據(jù)存儲到cache中時(shí),在列式內(nèi)存數(shù)據(jù)庫中獲取到所述目標(biāo)列的末行標(biāo)識或者無法獲取到所述目標(biāo)列的下一行的地址或者指針時(shí),則生成查詢結(jié)束標(biāo)識。
5.如權(quán)利要求1或2所述的方法,其特征在于,所述Cache為L2級別時(shí),所述m為1000-10000。
6.一種數(shù)據(jù)庫查詢服務(wù)器,其特征在于,包括,接收模塊,解析模塊、確定模塊和查詢模塊,其中: 所述接收模塊,用于接收請求者發(fā)送的查詢請求,所述查詢請求包含查詢條件,并將所述查詢請求發(fā)送到所述解析模塊上; 所述解析模塊,用于接收所述接收模塊發(fā)送到的查詢請求,并解析所述查詢請求,獲得查詢條件,將所述查詢條件發(fā)送到所述確定模塊和所述查詢模塊上; 所述確定模塊,用于接收所述解析模塊發(fā)送到的查詢條件,并從列式內(nèi)存數(shù)據(jù)庫中,確定與查詢條件相關(guān)的目標(biāo)列;和 所述查詢模塊,用于循環(huán)執(zhí)行以下步驟,直到完成所有行的查詢:從所述各個目標(biāo)列的第行開始,將列式內(nèi)存數(shù)據(jù)庫中的所述各個目標(biāo)列中連續(xù)m行的數(shù)據(jù)或最后少于m行的數(shù)據(jù)存儲到緩存Cache,根據(jù)所述查詢條件,查詢所述Cache存儲的數(shù)據(jù),發(fā)送分段查詢結(jié)果和釋放所述Cache的存儲空間,其中m是一個自然常數(shù),i是變量,表示已經(jīng)循環(huán)執(zhí)行的次數(shù)。
7.如權(quán)利要求6所述的數(shù)據(jù)庫查詢服務(wù)器,其特征在于,所述查詢模塊,具體用于當(dāng)查詢最后的m行或者少于m行的數(shù)據(jù)時(shí),發(fā)送包含所述查詢結(jié)束標(biāo)識的分段查詢結(jié)果,以通知所述請求者本次查詢請求已經(jīng)完成。
8.如權(quán)利要求6所述的數(shù)據(jù)庫查詢服務(wù)器,其特征在于,還包括:生成模塊,用于當(dāng)將從列式內(nèi)存數(shù)據(jù)庫中的目標(biāo)列某行的數(shù)據(jù)存儲到cache中時(shí),在列式內(nèi)存數(shù)據(jù)庫中獲取到所述目標(biāo)列的末行標(biāo)識或者無法獲取到所述目標(biāo)列的下一行的地址或者指針時(shí),生成查詢結(jié)束標(biāo)識。
9.一種列式內(nèi)存數(shù)據(jù)庫查詢的方法,其特征在于,所述方法包括: 接收查詢請求; 解析所述查詢請求,獲得查詢條件; 從列式內(nèi)存數(shù)據(jù)庫中,確定與查詢條件相關(guān)的目標(biāo)列; 循環(huán)執(zhí)行以下步驟,直到完成所有行的查詢:從所述各個目標(biāo)列的第m*(1-l)+l行開始,將列式內(nèi)存數(shù)據(jù)庫中的所述各個目標(biāo)列中連續(xù)m行的數(shù)據(jù)或者最后少于m行的數(shù)據(jù)存儲到緩存Cache,根據(jù)所述查詢條件,查詢所述Cache存儲的數(shù)據(jù),在臨時(shí)存儲模塊中存儲分段查詢結(jié)果,釋放所述Cache的存儲空間,其中m是一個自然常數(shù),i為變量,表示已經(jīng)循環(huán)執(zhí)行的次數(shù); 當(dāng)所述查詢條件相關(guān)的目標(biāo)列的數(shù)據(jù)均被查詢后,組合臨時(shí)存儲模塊中的各個分段查詢結(jié)果,將組合后的查詢結(jié)果作為最終查詢結(jié)果,發(fā)送所述最終查詢結(jié)果。
10.如權(quán)利要求9所述的方法,其特征在于,所述方法還包括: 當(dāng)將從列式內(nèi)存數(shù)據(jù)庫中的目標(biāo)列某行的數(shù)據(jù)存儲到cache中,在列式內(nèi)存數(shù)據(jù)庫中獲取到所述目標(biāo)列的末行標(biāo)識,或者無法獲取到所述目標(biāo)列的下一行的地址或者指針時(shí),生成查詢結(jié)束標(biāo)識,以通知所述臨時(shí)存儲模塊組合臨時(shí)存儲模塊中的各個分段查詢結(jié)果。
11.一種數(shù)據(jù)庫查詢服 務(wù)器,其特征在于,包括,接收模塊,解析模塊、確定模塊、查詢模塊和臨時(shí)存儲模塊,其中: 所述接收模塊,用于接收請求者發(fā)送的查詢請求,所述查詢請求包含查詢條件,并將所述查詢請求發(fā)送到所述解析模塊上; 所述解析模塊,用于接收所述接收模塊發(fā)送到的查詢請求,并解析所述查詢請求,獲得查詢條件,將所述查詢條件發(fā)送到所述確定模塊和所述查詢模塊上; 所述確定模塊,用于接收所述解析模塊發(fā)送到的查詢條件,并從列式內(nèi)存數(shù)據(jù)庫中,確定與查詢條件相關(guān)的目標(biāo)列;和 所述查詢模塊,用于循環(huán)執(zhí)行以下步驟,直到完成所有行的查詢:從所述各個目標(biāo)列的第行開始,將列式內(nèi)存數(shù)據(jù)庫中的所述各個目標(biāo)列中連續(xù)m行的數(shù)據(jù)或最后少于m行的數(shù)據(jù)存儲到緩存Cache,根據(jù)所述查詢條件,查詢所述Cache存儲的數(shù)據(jù),在臨時(shí)存儲模塊中存儲分段查詢結(jié)果,釋放所述Cache的存儲空間,其中m是一個自然常數(shù),i是變量,表示已經(jīng)循環(huán)執(zhí)行的次數(shù); 所述臨時(shí)存儲模塊,用于存儲循環(huán)執(zhí)行過程中的分段查詢結(jié)果,當(dāng)所述查詢條件相關(guān)的目標(biāo)列的數(shù)據(jù)均被查詢后,組合臨時(shí)存儲模塊中的各個分段查詢結(jié)果,將組合后的查詢結(jié)果作為最終查詢結(jié)果,發(fā)送所述最終查詢結(jié)果。
12.如權(quán)利要求11所述的數(shù)據(jù)庫查詢服務(wù)器,其特征在于,還包括:生成模塊,用于當(dāng)將從列式內(nèi)存數(shù)據(jù)庫中的目標(biāo)列某行的數(shù)據(jù)存儲到cache中,在列式內(nèi)存數(shù)據(jù)庫中獲取到所述目標(biāo)列的末行標(biāo)識,或者無法獲取到所述目標(biāo)列的下一行的地址或者指針時(shí),生成查詢結(jié)束標(biāo)識,以通知所述臨時(shí)存儲模塊組合臨時(shí)存儲模塊中的各個分段查詢結(jié)果。
【文檔編號】G06F17/30GK103970870SQ201410199444
【公開日】2014年8月6日 申請日期:2014年5月12日 優(yōu)先權(quán)日:2014年5月12日
【發(fā)明者】李偉鑫, 吳繼敏, 蔡利元, 劉成華 申請人:華為技術(shù)有限公司