本發(fā)明涉及計(jì)算機(jī)數(shù)據(jù)庫(kù)
技術(shù)領(lǐng)域:
,尤其涉及一種基于數(shù)據(jù)模式轉(zhuǎn)換和并行框架的關(guān)系數(shù)據(jù)查詢優(yōu)化方法。
背景技術(shù):
:隨著各類應(yīng)用中數(shù)據(jù)的規(guī)模不斷增加,這導(dǎo)致了在集中式的關(guān)系數(shù)據(jù)庫(kù)上的對(duì)大規(guī)模數(shù)據(jù)查詢操作執(zhí)行響應(yīng)時(shí)間增加,影響了應(yīng)用系統(tǒng)在查詢處理實(shí)時(shí)性上的需求,如何提高海量數(shù)據(jù)上查詢處理的性能已經(jīng)成為數(shù)據(jù)庫(kù)應(yīng)用領(lǐng)域一個(gè)重要需求;針對(duì)海量數(shù)據(jù)的存儲(chǔ)和訪問(wèn),現(xiàn)有數(shù)據(jù)管理系統(tǒng)采用分布式存儲(chǔ)和并行查詢處理的方式來(lái)提高查詢處理的性能;將集中式關(guān)系數(shù)據(jù)庫(kù)上的查詢進(jìn)行分解,將需要并行處理部分合理地轉(zhuǎn)移到并行處理框架下運(yùn)行,將能夠極大地提高查詢處理的性能,滿足實(shí)際應(yīng)用在實(shí)時(shí)性上的需求;造成當(dāng)前關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)在一些復(fù)雜查詢上性能低下的主要原因在于關(guān)系模型針對(duì)的是通用型數(shù)據(jù)庫(kù),在模式設(shè)計(jì)上主要面向減少數(shù)據(jù)冗余的思想,這樣的結(jié)果就是在實(shí)際的查詢執(zhí)行時(shí)需要對(duì)多個(gè)關(guān)系表進(jìn)行連接操作,而連接操作在關(guān)系數(shù)據(jù)庫(kù)中屬于執(zhí)行代價(jià)較高的操作,數(shù)據(jù)庫(kù)管理系統(tǒng)自身的查詢優(yōu)化器并不一定能夠生產(chǎn)最優(yōu)的執(zhí)行策略;關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)在并行查詢處理上的能力較弱,現(xiàn)有的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)雖然支持多處理器的并行方式,但是并不支持多主機(jī)的并行處理,這樣在數(shù)據(jù)規(guī)模變大的情況下,很難通過(guò)水平擴(kuò)展的方式保證查詢處理的執(zhí)行性能;采用關(guān)系模型存儲(chǔ)的數(shù)據(jù)在實(shí)現(xiàn)一些特助應(yīng)用中的業(yè)務(wù)邏輯時(shí)會(huì)收到關(guān)系代數(shù)操作符的限制,從而不得不以較復(fù)雜的查詢方式實(shí)現(xiàn),這導(dǎo)致了查詢執(zhí)行性能的進(jìn)一步下降;現(xiàn)在,針對(duì)一些特殊數(shù)據(jù)查詢應(yīng)用已經(jīng)提出了新的數(shù)據(jù)模型,如鍵值模型,同時(shí)基于這些數(shù)據(jù)模型也有相應(yīng)的并行計(jì)算框架以支撐對(duì)海量數(shù)據(jù)信息的并行查詢處理。然而,目前缺少一種有效的方法將關(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)針對(duì)查詢的特征準(zhǔn)確地轉(zhuǎn)換到spark并行查詢處理框架之上以提高各類復(fù)雜查詢處理的執(zhí)行效率。技術(shù)實(shí)現(xiàn)要素:針對(duì)現(xiàn)有技術(shù)的缺陷,本發(fā)明提供一種基于數(shù)據(jù)模式轉(zhuǎn)換和并行框架的關(guān)系數(shù)據(jù)查詢優(yōu)化方法,能夠?qū)㈥P(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)針對(duì)查詢的特征準(zhǔn)確地轉(zhuǎn)換到spark并行查詢處理框架之上,從而有效提高對(duì)關(guān)系數(shù)據(jù)庫(kù)上部分頻繁執(zhí)行的復(fù)雜查詢的處理效率。一種基于數(shù)據(jù)模式轉(zhuǎn)換和并行框架的關(guān)系數(shù)據(jù)查詢優(yōu)化方法,包括以下步驟:步驟1:對(duì)關(guān)系模型數(shù)據(jù)上復(fù)雜查詢語(yǔ)句進(jìn)行結(jié)構(gòu)分析;首先對(duì)執(zhí)行性能較低的關(guān)系數(shù)據(jù)庫(kù)上的結(jié)構(gòu)化查詢語(yǔ)句,即sql查詢語(yǔ)句,轉(zhuǎn)化為sql語(yǔ)法解析樹(shù)結(jié)構(gòu),以進(jìn)行下一步分析,找出關(guān)系數(shù)據(jù)庫(kù)上的sql查詢語(yǔ)句中能夠通過(guò)轉(zhuǎn)換為新的數(shù)據(jù)模式存儲(chǔ)數(shù)據(jù)和并行查詢方式進(jìn)行優(yōu)化以提高查詢效率的查詢語(yǔ)句結(jié)構(gòu),以用于在下一個(gè)步驟中生成數(shù)據(jù)的鍵值模型存儲(chǔ)結(jié)構(gòu);要找出的能進(jìn)行優(yōu)化的查詢語(yǔ)句結(jié)構(gòu)包括基于關(guān)系表關(guān)鍵字作為連接屬性的多表連接查詢結(jié)構(gòu)、能聚合文本屬性值的嵌套查詢結(jié)構(gòu)、能并行執(zhí)行的嵌套查詢結(jié)構(gòu)和查詢謂詞中包含的編碼屬性匹配查詢;步驟2:構(gòu)建新的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu);基于對(duì)數(shù)據(jù)模式上的sql查詢語(yǔ)句的分析,結(jié)合查詢所涉及關(guān)系表的關(guān)系模式結(jié)構(gòu),進(jìn)一步構(gòu)建新的數(shù)據(jù)模式存儲(chǔ)結(jié)構(gòu),以實(shí)現(xiàn)通過(guò)新的數(shù)據(jù)模式的數(shù)據(jù)存儲(chǔ)提高查詢執(zhí)行效率,新的數(shù)據(jù)模式為關(guān)系模型或鍵值模型;步驟3:基于步驟2中所生成的新的數(shù)據(jù)模式存儲(chǔ)結(jié)構(gòu),實(shí)現(xiàn)在數(shù)據(jù)存儲(chǔ)上的轉(zhuǎn)換處理,將關(guān)系模型數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù)轉(zhuǎn)存到新的數(shù)據(jù)模式存儲(chǔ)系統(tǒng)中;步驟4:進(jìn)行查詢語(yǔ)句的轉(zhuǎn)換,由于sparksql能夠直接支持sql查詢語(yǔ)句,因此查詢語(yǔ)句的轉(zhuǎn)換僅針對(duì)數(shù)據(jù)模式的變化做出相應(yīng)修改;步驟5:基于sparksql查詢生成spark任務(wù)并執(zhí)行該任務(wù),sparksql查詢?nèi)蝿?wù)的生成基于查詢語(yǔ)句轉(zhuǎn)換的結(jié)果進(jìn)行,基于步驟4的轉(zhuǎn)換結(jié)果進(jìn)行判斷,如果沒(méi)有生成不相關(guān)子查詢的獨(dú)立任務(wù),則整體執(zhí)行轉(zhuǎn)換后的查詢語(yǔ)句,直接將轉(zhuǎn)換后的查詢語(yǔ)句作為查詢?nèi)蝿?wù)提交給sparksql引擎執(zhí)行查詢操作,執(zhí)行后結(jié)果數(shù)據(jù)以schemardd形式返回,如果生成了不相關(guān)子查詢的獨(dú)立任務(wù),則基于sparksql查詢的構(gòu)建并執(zhí)行查詢處理任務(wù)。進(jìn)一步地,所述步驟1中找出基于關(guān)系表關(guān)鍵字作為連接屬性的多表連接查詢結(jié)構(gòu)的方法為:對(duì)關(guān)系模式數(shù)據(jù)上的sql查詢語(yǔ)句構(gòu)建關(guān)系代數(shù)形式的查詢樹(shù),在關(guān)系代數(shù)查詢樹(shù)上通過(guò)關(guān)系運(yùn)算操作符的等價(jià)變換,找出多個(gè)關(guān)系表的連接查詢結(jié)構(gòu),其中關(guān)系表表示為t1={k1,a1},t2={k2,a2},...,tn={kn,an},ti表示一個(gè)關(guān)系表,ki表示關(guān)系表ti的連接屬性集合且為表ti的主鍵,ai表示關(guān)系表ti的非連接屬性集合,i=1,2,...,n,即qs=t1∞t2∞...∞tn,記錄這個(gè)基于關(guān)系表關(guān)鍵字作為連接屬性的多表連接查詢結(jié)構(gòu)qs;所述步驟1中找出可聚合文本屬性值的嵌套查詢結(jié)構(gòu)的方法為:查找sql查詢語(yǔ)句中在關(guān)系表文本屬性上的文本模糊匹配查詢,判斷這個(gè)文本模糊匹配查詢是否在一個(gè)exists操作符的嵌套相關(guān)子查詢結(jié)構(gòu)中,如果該子查詢結(jié)構(gòu)中符合查詢結(jié)構(gòu)“select*fromtwheret.ak=u.aandct”,其中t表示子查詢關(guān)系表,u表示父查詢關(guān)系表,ak表示相關(guān)子查詢連接屬性,ct表示在文本屬性at上的文本模糊匹配查詢謂詞,則標(biāo)記該子查詢?yōu)榭删酆衔谋緦傩灾档牟樵兘Y(jié)構(gòu);所述步驟1中找出能并行執(zhí)行的嵌套查詢結(jié)構(gòu)中,在查詢語(yǔ)句中發(fā)現(xiàn)并標(biāo)記不相關(guān)子查詢,先執(zhí)行不相關(guān)子查詢,同時(shí)將父查詢的中間結(jié)果數(shù)據(jù)進(jìn)行分片,然后將子查詢結(jié)果發(fā)送到各個(gè)中間結(jié)果數(shù)據(jù);所述步驟1中找出查詢謂詞中包含的編碼屬性匹配查詢的方法為:在sql查詢語(yǔ)句中,如果一個(gè)查詢謂詞的查詢屬性a為基于一個(gè)代碼表rc的屬性,即該屬性上a的屬性值w依賴于代碼表rc中的有限個(gè)編碼值,屬性值w為單個(gè)編碼值或由多個(gè)編碼值和分隔符拼接而成的文本,同時(shí)查詢條件為基于一個(gè)或多個(gè)編碼值的“邏輯或”匹配方式,即假設(shè)屬性值為“a1,a2,...,an”,查詢謂詞中待匹配值為“b1,b2,...,bm”,如果存在ai=bj,i∈1,2,...,n,j∈1,2,...,m,則記錄該查詢謂詞的查詢屬性;所述代碼表指一個(gè)記錄數(shù)量固定且表示一種編碼規(guī)則的關(guān)系表,關(guān)系表中包含編碼屬性和語(yǔ)義屬性。進(jìn)一步地,所述步驟2構(gòu)建新的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的具體步驟包括:步驟2-1:合并關(guān)系表以生成新的數(shù)據(jù)模式結(jié)構(gòu);對(duì)于在找出基于關(guān)系表關(guān)鍵字作為連接屬性的多表連接查詢結(jié)構(gòu)的過(guò)程中標(biāo)記出的sql查詢語(yǔ)句中所包含的關(guān)鍵字作為連接屬性的多表連接查詢結(jié)構(gòu),將其中的多個(gè)關(guān)系表涉及的關(guān)系表集合{t1,t2,...,tn}合并為新的數(shù)據(jù)模式結(jié)構(gòu),表示為ts(key,v),其中key為關(guān)鍵字,其結(jié)構(gòu)由關(guān)系表中的連接屬性{k1,k2,...,kn}中所包含的屬性構(gòu)成,v為新關(guān)系表中的非主屬性集合,對(duì)應(yīng)關(guān)系表集合中的非主屬性集合{a1,a2,...,an};步驟2-2:使用位向量編碼方式優(yōu)化基于代碼表存儲(chǔ)的屬性;對(duì)于在找出查詢謂詞中包含的編碼屬性匹配查詢過(guò)程中找出的查詢謂詞涉及的編碼屬性,基于代碼表中的編碼順序?qū)傩灾祷谖幌蛄啃问竭M(jìn)行重新編碼,生成新的編碼屬性ac;編碼方式為,對(duì)于一個(gè)記錄在找出的查詢謂詞涉及的編碼屬性上的屬性值構(gòu)建一個(gè)與代碼表中記錄數(shù)量相同長(zhǎng)度的二進(jìn)制位向量,如果在原屬性值中包含對(duì)應(yīng)二進(jìn)制位上的編碼值,則該位上標(biāo)記為1,否則標(biāo)記為0;轉(zhuǎn)換后數(shù)據(jù)模式中位向量編碼的屬性值以二進(jìn)制位向量或整型存儲(chǔ);步驟2-3:生成具有聚合文本屬性值的模式結(jié)構(gòu);對(duì)于在找出能聚合文本屬性值的嵌套查詢結(jié)構(gòu)過(guò)程中找出的聚合文本屬性值的嵌套查詢結(jié)構(gòu),生成相關(guān)屬性的符合結(jié)構(gòu)屬性,通過(guò)聚合同一個(gè)查找鍵值下多個(gè)記錄的多個(gè)文本屬性值,實(shí)現(xiàn)在查詢執(zhí)行過(guò)程中一次訪問(wèn)全部文本屬性值內(nèi)容并進(jìn)行模糊匹配,從而提高查詢效率;新的具有聚合文本屬性值的模式結(jié)構(gòu)的構(gòu)建方式為,對(duì)于相關(guān)子查詢“select*fromtwheret.ak=u.aandct”中的關(guān)系表t,文本屬性at為文本匹配查詢謂詞ct所包含的查詢屬性,創(chuàng)建新的關(guān)系表t′,t′中使用屬性ak作為主關(guān)鍵字,對(duì)于關(guān)系表t中屬性ak上具有相同取值的多個(gè)記錄,使用指定分隔符將多個(gè)記錄中文本屬性at的屬性值進(jìn)行拼接,生成新關(guān)系表t′中新文本屬性at′的對(duì)應(yīng)屬性值。進(jìn)一步地,所述步驟2中構(gòu)建的新的數(shù)據(jù)模式為關(guān)系模型時(shí),步驟3中數(shù)據(jù)存儲(chǔ)上的轉(zhuǎn)換處理方式為:(1)執(zhí)行合并關(guān)系表數(shù)據(jù)模式的數(shù)據(jù)轉(zhuǎn)換,基于合并后的關(guān)系表創(chuàng)建新表t′,新表數(shù)據(jù)從合并前的關(guān)系表導(dǎo)入;(2)對(duì)于關(guān)系模式中進(jìn)行位向量編碼轉(zhuǎn)換的屬性,對(duì)于一個(gè)記錄中屬性值的編碼轉(zhuǎn)換方式是為該屬性值構(gòu)建一個(gè)與代碼表中記錄數(shù)量相同長(zhǎng)度的二進(jìn)制位向量bv,如果在原屬性值中包含對(duì)應(yīng)二進(jìn)制位上的編碼值,則該位上標(biāo)記為1否則標(biāo)記為0,再將該位向量按照64位長(zhǎng)度整數(shù)進(jìn)行分割和補(bǔ)位生成有一個(gè)或多個(gè)整數(shù)表示的位向量值,如果用多個(gè)整數(shù)表示,則轉(zhuǎn)換后可生成多個(gè)位向量屬性;(3)對(duì)于具有聚合文本屬性值的數(shù)據(jù)模式的數(shù)據(jù)存儲(chǔ)轉(zhuǎn)換,在新的關(guān)系表t′中增加屬性at′,子查詢中關(guān)系表的文本屬性為at,屬性at′的屬性值由其對(duì)應(yīng)的主鍵在子查詢關(guān)系表中對(duì)應(yīng)記錄分組在屬性at上的值集合使用分隔符進(jìn)行拼接生成;(4)其它不涉及模式轉(zhuǎn)換的關(guān)系表保持原結(jié)構(gòu)不變;所述步驟2中構(gòu)建的新的數(shù)據(jù)模式為鍵值模型時(shí),步驟3中數(shù)據(jù)存儲(chǔ)上的轉(zhuǎn)換處理方式為:(1)對(duì)于合并關(guān)系表所生成的新的表結(jié)構(gòu)創(chuàng)建列族cf(colunmfamily),如果作為連接屬性的主鍵為單屬性主鍵,則主鍵ak(ak表示主鍵屬性)作為行鍵(rowkey),行鍵取值為主鍵屬性值;如果連接屬性的主鍵為屬性組,則屬性組組合作為行鍵,行鍵取值為主鍵屬性結(jié)合連接符的拼接文本,同時(shí)主鍵中包含的每個(gè)屬性轉(zhuǎn)換為一個(gè)列;原始關(guān)系表中的每個(gè)普通屬性轉(zhuǎn)換為列族cf中的一個(gè)列,數(shù)據(jù)由原關(guān)系表導(dǎo)入;(2)對(duì)于位向量編碼方式屬性的數(shù)據(jù)轉(zhuǎn)換,如果底層存儲(chǔ)引擎支持整型數(shù)據(jù)類型的定義,則采用與關(guān)系模型存儲(chǔ)轉(zhuǎn)換中相同的方法對(duì)屬性值進(jìn)行編碼轉(zhuǎn)換,如果底層存儲(chǔ)引擎只支持文本屬性存儲(chǔ),則不進(jìn)行屬性編碼的轉(zhuǎn)換;(3)對(duì)于具有聚合文本屬性值的數(shù)據(jù)模式的數(shù)據(jù)存儲(chǔ)轉(zhuǎn)換,在列族cf(colunmfamily)中增加一個(gè)文本數(shù)據(jù)列rt(即colunm),rt列上的值同樣由具有多個(gè)相關(guān)子查詢連接屬性ak的屬性值記錄的文本屬性at的屬性值拼接生成;(4)對(duì)于其它關(guān)系表都將轉(zhuǎn)換為列族,將關(guān)系表的主關(guān)鍵字(即主鍵)轉(zhuǎn)換為行鍵,關(guān)系表的其它屬性和屬性值轉(zhuǎn)換為對(duì)應(yīng)的列和列值。進(jìn)一步地,所述步驟4查詢語(yǔ)句轉(zhuǎn)換的具體方法如下:步驟4-1:如果查詢語(yǔ)句中涉及到對(duì)位向量方式重新編碼后的屬性的查詢,則轉(zhuǎn)換對(duì)位向量編碼屬性上的查詢,以生成基于位向量屬性值的查詢謂詞,假設(shè)查詢謂詞中對(duì)于屬性值查詢條件的待匹配值集合為{b1,b2,...,bm},則將該待匹配值集合按照代碼表生成相應(yīng)的位向量qc;將原查詢語(yǔ)句中原文本屬性上的“l(fā)ike”查詢或“in”查詢語(yǔ)句替換為新編碼屬性ac上基于“邏輯與”的位運(yùn)算,即ac&qc,如果有匹配的值,則位運(yùn)算結(jié)果為正數(shù),否則位運(yùn)算結(jié)果為0,即判斷為假;步驟4-2:使用具有聚合文本屬性列的查詢謂詞替換嵌套相關(guān)子查詢的關(guān)系表;步驟4-3:替換多表連接查詢;對(duì)于原sql查詢中的基于關(guān)系表關(guān)鍵字作為連接屬性的多表連接子查詢,qs=t1∞t2∞...∞tn,使用在新的數(shù)據(jù)模式結(jié)構(gòu)ts或列簇cf上的查詢代替;步驟4-4:抽取不相關(guān)子查詢語(yǔ)句作為獨(dú)立任務(wù);對(duì)于查詢語(yǔ)句分析中發(fā)現(xiàn)的不相關(guān)子查詢的嵌套查詢,如果該不相關(guān)子查詢的父查詢是不包含連接操作的最上層查詢,則將該不相關(guān)子查詢分離出來(lái)作為一個(gè)獨(dú)立的sparksql的sql查詢?nèi)蝿?wù)。進(jìn)一步地,所述步驟5中基于sparksql查詢的構(gòu)建并執(zhí)行查詢處理任務(wù),具體方法為:將查詢語(yǔ)句分為主查詢和子查詢,每個(gè)查詢都生成相應(yīng)的sparksql引擎上的sql查詢?nèi)蝿?wù),主查詢執(zhí)行后生成相應(yīng)的schemardd結(jié)果集,子查詢執(zhí)行后生成相應(yīng)的filterrdd結(jié)果集;基于子查詢?cè)谥鞑樵冎胁樵冎^詞的相應(yīng)屬性,利用spark引擎中的過(guò)濾活動(dòng)在主查詢的schemardd結(jié)果集中使用子查詢的filterrdd結(jié)果集作為過(guò)濾條件得到最后的查詢處理結(jié)果;如果原始查詢中包含排序操作,則還需要調(diào)用spark引擎的排序活動(dòng)對(duì)最終的查詢結(jié)果進(jìn)行排序,生成最終排序的查詢結(jié)果集合。由上述技術(shù)方案可知,本發(fā)明的有益效果在于:本發(fā)明提供的一種基于數(shù)據(jù)模式轉(zhuǎn)換和并行框架的關(guān)系數(shù)據(jù)查詢優(yōu)化方法,能夠?qū)㈥P(guān)系數(shù)據(jù)庫(kù)中的數(shù)據(jù)針對(duì)查詢的特征準(zhǔn)確地轉(zhuǎn)換到spark并行查詢處理框架之上,從而有效提高對(duì)關(guān)系數(shù)據(jù)庫(kù)上部分頻繁執(zhí)行的復(fù)雜查詢的處理效率。本發(fā)明能夠提高特定復(fù)雜查詢下數(shù)據(jù)的存儲(chǔ)效率和查詢處理的執(zhí)行效率,減少查詢執(zhí)行時(shí)間;本發(fā)明具有較高的通用性,對(duì)于轉(zhuǎn)換后的數(shù)據(jù)模式既可以依然使用關(guān)系模型進(jìn)行存儲(chǔ),也可以使用面向海量數(shù)據(jù)訪問(wèn)而提出的鍵值模型進(jìn)行存儲(chǔ);本發(fā)明很好的利用了高效的spark并行處理框架,將關(guān)系數(shù)據(jù)上的結(jié)構(gòu)化查詢以最佳的并行方式和內(nèi)存處理方式執(zhí)行,從而提高查詢性能;本發(fā)明能夠應(yīng)用于改善針對(duì)更新不頻繁的的海量關(guān)系數(shù)據(jù)上的復(fù)雜查詢處理性能,提高查詢的執(zhí)行效率。附圖說(shuō)明圖1為本發(fā)明實(shí)施例提供的基于數(shù)據(jù)模型轉(zhuǎn)換和并行框架的關(guān)系數(shù)據(jù)查詢優(yōu)化方法的處理框架示意圖;圖2為本發(fā)明實(shí)施例提供的sql查詢語(yǔ)法解析樹(shù)結(jié)構(gòu)示意圖。具體實(shí)施方式下面結(jié)合附圖和實(shí)施例,對(duì)本發(fā)明的具體實(shí)施方式作進(jìn)一步詳細(xì)描述。以下實(shí)施例用于說(shuō)明本發(fā)明,但不用來(lái)限制本發(fā)明的范圍。本實(shí)施例的軟硬件環(huán)境為:服務(wù)器集群,其中單個(gè)服務(wù)器主機(jī)硬件為2ghz處理器,內(nèi)存4g,軟件為linux操作系統(tǒng)redhatlinux,安裝hdfs、hbase和apachespark框架。本實(shí)施例中提供如下文章評(píng)審關(guān)系數(shù)據(jù)庫(kù)模式:專家表:e(專家號(hào),專家姓名,證件號(hào)碼,職稱,所屬單位),其中“專家號(hào)”為主鍵,“職稱”屬性為指向tcode的外鍵,如表1所示;表1專家表e數(shù)據(jù)表專家號(hào)專家姓名證件號(hào)碼職稱所屬單位1王一110001教授高校12李二120001副教授高校23張三110031教授高校34李四320001研究員高校25趙一300401副教授高校16孫二120021高級(jí)工程師高校47張一113034副研究員高校58王二330041高級(jí)工程師高校69趙三130451中級(jí)及以下高校310李二656001副教授高校611張四110867教授高校712孫一120441無(wú)高校6專家所屬行業(yè)領(lǐng)域:ed(專家號(hào),行業(yè)領(lǐng)域),其中“專家號(hào)”為主鍵,如表2所示;表2專家行業(yè)領(lǐng)域表ed數(shù)據(jù)表專家學(xué)術(shù)頭銜:eh(專家號(hào),學(xué)術(shù)頭銜),其中“專家號(hào)”為外鍵,如表3所示;表3專家學(xué)術(shù)頭銜表eh數(shù)據(jù)表專家號(hào)學(xué)術(shù)頭銜1工程院院士1973首席專家3863領(lǐng)域?qū)<?科學(xué)院院士5萬(wàn)人計(jì)劃7千人計(jì)劃10萬(wàn)人計(jì)劃10863領(lǐng)域?qū)<?1長(zhǎng)江學(xué)者11973首席專家待評(píng)審文章信息:p(文章編號(hào),標(biāo)題,文章作者,作者單位),其中“文章編號(hào)”為外鍵;專家職稱代碼表:tcode(職稱名稱)職稱名稱為主鍵。要為待評(píng)審文章選擇一組專家進(jìn)行評(píng)審,有如下查詢要求:1.專家“職稱”屬性的值可以為以下取值其中之一:“教授”、“副教授”、“研究員”和“副研究員”;2.專家的“學(xué)術(shù)頭銜”包含文本其中之一:“院士”和“首席專家”;3.專家所屬行業(yè)領(lǐng)域的“行業(yè)領(lǐng)域”屬性的值為“數(shù)據(jù)庫(kù)”;4.要求文章作者所在單位的專家不能參與評(píng)審文章,即專家的“所屬單位”屬性值不能與任何一篇待評(píng)審文章中作者單位相同;5.查詢符合以上條件的專家的相關(guān)信息。針對(duì)以上查詢要求,生成在關(guān)系數(shù)據(jù)庫(kù)上的結(jié)構(gòu)化查詢?yōu)椋簊electe.專家號(hào),e.專家姓名,e.證件號(hào)碼,e.所屬單位frome,edwheree.專家號(hào)=ed.專家號(hào)anded.行業(yè)領(lǐng)域=“數(shù)據(jù)庫(kù)”ande.職稱in(″教授″,″副教授″,″研究員″,″副研究員″)andexists(select1fromehwheree.專家號(hào)=eh.專家號(hào)and(eh.學(xué)術(shù)頭銜like″%院士%″oreh.學(xué)術(shù)頭銜like″%首席專家%″)ande.所屬單位notin(selectdistinctp.作者單位fromp)下面基于數(shù)據(jù)模式轉(zhuǎn)換和并行框架的關(guān)系數(shù)據(jù)查詢優(yōu)化方法將查詢轉(zhuǎn)換為分布式處理結(jié)構(gòu),如圖1所示,為本實(shí)施例方法的處理框架示意圖,具體方法步驟如下。步驟1:對(duì)關(guān)系模型數(shù)據(jù)上復(fù)雜查詢語(yǔ)句進(jìn)行結(jié)構(gòu)分析,針對(duì)查詢構(gòu)建基于sql語(yǔ)句的查詢解析樹(shù),并從中發(fā)現(xiàn)可以用于優(yōu)化的查詢結(jié)構(gòu)。具體方法為:步驟1-1:對(duì)該復(fù)雜查詢語(yǔ)句轉(zhuǎn)換成關(guān)系代數(shù)所表達(dá)的解析樹(shù)結(jié)構(gòu),以進(jìn)行下一步分析,轉(zhuǎn)換后的sql語(yǔ)法解析樹(shù)如圖2所示,其中查詢語(yǔ)句采用語(yǔ)法解析樹(shù)結(jié)構(gòu)進(jìn)行表示,<query>表示查詢或子查詢結(jié)構(gòu),<sfw>表示sql的select-from-where查詢結(jié)構(gòu),<select_list>表示sql的select子句,<from_list>表示sql的from子句,<where_condition>表示sql的where子句,<attrname>表示關(guān)系的屬性名,<attrlist>表示關(guān)系的屬性列表,<relname>表示關(guān)系名,<rellist>表示關(guān)系列表,<condition>表示查詢條件結(jié)構(gòu),<pattern>表示查詢要匹配的模式內(nèi)容;步驟1-2:在查詢語(yǔ)句中找出基于關(guān)系表關(guān)鍵字作為連接屬性的多表連接查詢結(jié)構(gòu);在本實(shí)施例中,圖2中所標(biāo)識(shí)出的q1部分的查詢結(jié)構(gòu)可以轉(zhuǎn)換為關(guān)系表e和關(guān)系表ed基于“專家號(hào)”屬性的連接操作,而“專家號(hào)”屬性在兩個(gè)關(guān)系表中都是關(guān)鍵字,即查詢中包含qs=e∞ed查詢結(jié)構(gòu)符合基于關(guān)系表關(guān)鍵字作為連接屬性的多表連接查詢結(jié)構(gòu);步驟1-3:在查詢語(yǔ)句中找出可聚合文本屬性值的嵌套查詢結(jié)構(gòu);在本實(shí)施例中,如圖2中所標(biāo)識(shí)出的q3部分所示,其中包含一個(gè)exists操作符的嵌套相關(guān)子查詢結(jié)構(gòu),即查詢條件中的“exists(select1fromehwheree.專家號(hào)=eh.專家號(hào)and(eh.學(xué)術(shù)頭銜like″%院士%″oreh.學(xué)術(shù)頭銜like″%首席專家%″)”部分,其中子查詢關(guān)系表為eh,父查詢關(guān)系表為e,連接屬性為“e.專家號(hào)”和“eh.專家號(hào)”,進(jìn)行文本匹配的屬性為“eh.學(xué)術(shù)頭銜”,對(duì)應(yīng)的匹配謂詞為“eh.學(xué)術(shù)頭銜like″%院士%″oreh.學(xué)術(shù)頭銜like″%首席專家%″”,因此該結(jié)構(gòu)為可聚合文本屬性值的查詢結(jié)構(gòu);步驟1-4:在查詢語(yǔ)句中找出能并行執(zhí)行的嵌套查詢結(jié)構(gòu);在關(guān)系數(shù)據(jù)庫(kù)的查詢語(yǔ)句中,嵌套查詢中不相關(guān)子查詢的執(zhí)行過(guò)程是由內(nèi)向外的,即先執(zhí)行子查詢的執(zhí)行,在利用子查詢的執(zhí)行結(jié)果作為父查詢中查詢謂詞的執(zhí)行條件,比如sql中in,notin語(yǔ)句構(gòu)成的不相關(guān)子查詢結(jié)構(gòu);因此可以先執(zhí)行不相關(guān)子查詢,同時(shí)將父查詢的中間結(jié)果數(shù)據(jù)進(jìn)行分片,然后將子查詢結(jié)果發(fā)送到各個(gè)中間結(jié)果數(shù)據(jù);在本步驟中,在查詢語(yǔ)句中發(fā)現(xiàn)并標(biāo)記不相關(guān)子查詢;在本實(shí)施例中,如圖2中所標(biāo)識(shí)出的q4部分所示,其為“notin”語(yǔ)句構(gòu)成的查詢條件,對(duì)應(yīng)的子查詢?yōu)椤皊electdistinctp.作者單位fromp”,該查詢?yōu)椴幌嚓P(guān)子查詢,因此可以先執(zhí)行這個(gè)不相關(guān)子查詢,將結(jié)果存儲(chǔ)后發(fā)送到分布式的多個(gè)節(jié)點(diǎn)上執(zhí)行并行查詢處理;標(biāo)記該查詢結(jié)構(gòu);步驟1-5:在查詢語(yǔ)句中找出查詢謂詞中包含的編碼屬性匹配查詢;在本實(shí)施例中,如圖2中所標(biāo)識(shí)出的q2部分所示,查詢條件“e.職稱in(″教授″,″副教授″,″研究員″,″副研究員″)”中查詢屬性為“e.職稱”,代碼表為專家職稱代碼表tcode,其“e.職稱”的屬性值為tcode表中“職稱名稱”的單一取值,該查詢條件中匹配方式等價(jià)于“邏輯或”的匹配方式,要匹配的多個(gè)編碼值為{″教授″,″副教授″,″研究員″,″副研究員″},將該查詢結(jié)構(gòu)標(biāo)記為編碼屬性匹配查詢。本步驟主要目的是找出編碼屬性上的查詢,以便基于轉(zhuǎn)換編碼的方式對(duì)查詢處理進(jìn)行優(yōu)化。以上找出可進(jìn)行優(yōu)化的查詢語(yǔ)句結(jié)構(gòu)的步驟順序可以隨意調(diào)整,在這些步驟中發(fā)現(xiàn)的各類查詢結(jié)構(gòu)將在保證查詢語(yǔ)義不變的前提下用于后續(xù)優(yōu)化步驟之中。步驟2:基于以上對(duì)sql查詢語(yǔ)句的分析,將現(xiàn)有數(shù)據(jù)模式轉(zhuǎn)換為新的適合于分布式查詢的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)。具體方法為:步驟2-1:合并關(guān)系表以生成新的數(shù)據(jù)模式結(jié)構(gòu);對(duì)于在步驟1-2中標(biāo)記出的sql查詢語(yǔ)句中使用兩個(gè)表的關(guān)鍵字作為連接屬性的多表連接查詢結(jié)構(gòu)q1部分,將其中的關(guān)系表集合{e,ed}合并為新模式結(jié)構(gòu),表示為新專家表e′(“專家號(hào)”,{“專家姓名”,“證件號(hào)碼”,“職稱”,“所屬單位”,“行業(yè)領(lǐng)域”}),其中“專家號(hào)”為關(guān)鍵字,對(duì)應(yīng)關(guān)系表集合中的非主屬性集合為{“專家姓名”,“證件號(hào)碼”,“職稱”,“所屬單位”,“行業(yè)領(lǐng)域”},如表4所示;在本實(shí)施例中,采用hbase存儲(chǔ)新專家表e′數(shù)據(jù),因此使用列族數(shù)據(jù)(columnfamily)模型存儲(chǔ);表4轉(zhuǎn)換后新專家表e′數(shù)據(jù)表步驟2-2:使用位向量編碼方式優(yōu)化基于代碼表存儲(chǔ)的屬性;在本實(shí)施例中,“e.職稱”為基于代碼表的屬性,對(duì)其屬性值基于代碼表tcode進(jìn)行位向量編碼,其中代碼表中“職稱名稱”的各屬性值對(duì)應(yīng)的位向量編碼如表5所示,生成新屬性“e.職稱b”用32位整型值存儲(chǔ),如表4中的職稱b所示;表5職稱代碼表tcode數(shù)據(jù)表步驟2-3:為專家表生成具有聚合文本屬性值的模式結(jié)構(gòu);對(duì)于步驟1-3中找出的聚合文本屬性值的嵌套查詢結(jié)構(gòu)q3部分,在本步驟中生成相關(guān)屬性的符合結(jié)構(gòu)屬性,聚合專家學(xué)術(shù)頭銜表eh中同一個(gè)“專家號(hào)”屬性值下多個(gè)記錄的“學(xué)術(shù)頭銜”屬性值,在新專家表e’中增加“學(xué)術(shù)頭銜”屬性,其屬性值為每個(gè)“專家號(hào)”在對(duì)應(yīng)的專家學(xué)術(shù)頭銜表eh中,相同“專家號(hào)”對(duì)應(yīng)的多個(gè)“學(xué)術(shù)頭銜”屬性值使用逗號(hào)分隔符拼接的文本字符串。步驟3:將關(guān)系數(shù)據(jù)庫(kù)中存儲(chǔ)的各關(guān)系表數(shù)據(jù)轉(zhuǎn)存hbase存儲(chǔ)系統(tǒng)或關(guān)系數(shù)據(jù)庫(kù)中的對(duì)應(yīng)的表中;在本實(shí)施例中用hbase存儲(chǔ)系統(tǒng)時(shí),該存儲(chǔ)系統(tǒng)采用的是基于鍵值模型的列族模型數(shù)據(jù)存儲(chǔ),根據(jù)采用鍵值模型時(shí)的數(shù)據(jù)轉(zhuǎn)換方法:(1)首先基于合并關(guān)系表后生成的新專家表e′,創(chuàng)建存儲(chǔ)新專家表e′的列族e(cuò)xperts,其中行鍵設(shè)置為“專家號(hào)”,列包括{“專家姓名”,“證件號(hào)碼”,“職稱”,“所屬單位”,“行業(yè)領(lǐng)域”},對(duì)于行鍵值和行鍵值對(duì)應(yīng)各列的值從關(guān)系數(shù)據(jù)庫(kù)的專家表e和專家所屬行業(yè)領(lǐng)域表ed中的數(shù)據(jù)導(dǎo)入;(2)對(duì)于可以進(jìn)行位向量編碼方式的屬性“職稱”,因?yàn)閔base只支持文本屬性值存儲(chǔ),因此不進(jìn)行屬性編碼的轉(zhuǎn)換,使用原專家表e的“職稱”屬性的屬性值作為列族e(cuò)xperts中“職稱”列的值;(3)專家學(xué)術(shù)頭銜表eh中的“學(xué)術(shù)頭銜”屬性可以作為新專家表e’的復(fù)合結(jié)構(gòu)屬性,因此在列族e(cuò)xperts中創(chuàng)建“學(xué)術(shù)頭銜”列,列值為多個(gè)屬性值文本拼接后的取值,如表4中新專家表e’中“專家號(hào)”屬性值為“1”的記錄對(duì)應(yīng)的“學(xué)術(shù)頭銜”屬性值為“工程院院士、973首席專家”;(4)創(chuàng)建查詢涉及其它關(guān)系表的列族,對(duì)于待評(píng)審文章信息表p創(chuàng)建列族papers,其中行鍵為“文章編號(hào)”,列集合為{“標(biāo)題”,“文章作者”,“作者單位”};存儲(chǔ)轉(zhuǎn)換后,表4中新專家表e′的第一條記錄轉(zhuǎn)換到專家信息列族e(cuò)xperts中存儲(chǔ)的結(jié)構(gòu)如表6所示。表6專家信息列族e(cuò)xperts數(shù)據(jù)表在本實(shí)施例中用關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)時(shí),與hbase存儲(chǔ)數(shù)據(jù)的區(qū)別在于能使用位向量編碼方式存儲(chǔ)“職稱”屬性值。表4中新專家表e′的第一條記錄的“職稱”屬性轉(zhuǎn)換為位向量編碼方式后使用整型值“128”作為屬性值。步驟4:進(jìn)行查詢語(yǔ)句的轉(zhuǎn)換。在對(duì)數(shù)據(jù)模式進(jìn)行了重新構(gòu)建并進(jìn)行了數(shù)據(jù)存儲(chǔ)轉(zhuǎn)換之后,就可以支持查詢處理了,但在將查詢提交給spark框架進(jìn)行處理之前,還需要針對(duì)模式上的改變進(jìn)行查詢語(yǔ)句轉(zhuǎn)換,由于sparksql能夠直接支持sql查詢語(yǔ)句,因此查詢語(yǔ)句的轉(zhuǎn)換可以僅針對(duì)數(shù)據(jù)模式的變化做出相應(yīng)修改。本實(shí)施例中,針對(duì)在hbase上的數(shù)據(jù)存儲(chǔ)模式,將在關(guān)系數(shù)據(jù)庫(kù)上的sql查詢轉(zhuǎn)換為在spark框架上sparksql組件所支持的查詢結(jié)構(gòu),查詢語(yǔ)句轉(zhuǎn)換的步驟如下:步驟4-1:轉(zhuǎn)換對(duì)位向量編碼屬性上的查詢;在本實(shí)施例中,在hbase存儲(chǔ)系統(tǒng)中未對(duì)屬性值進(jìn)行編碼轉(zhuǎn)換,因此該步驟省略;步驟4-2:替換嵌套相關(guān)子查詢的關(guān)系表;本實(shí)施例中,使用具有聚合文本屬性列“學(xué)術(shù)頭銜”的查詢謂詞“學(xué)術(shù)頭銜like″%院士%″or學(xué)術(shù)頭銜like″%首席專家%″”替換原相關(guān)子查詢“exists(select1fromehwheree.專家號(hào)=eh.專家號(hào)and(eh.學(xué)術(shù)頭銜like″%院士%″oreh.學(xué)術(shù)頭銜like″%首席專家%″)ande.所屬單位notin(selectdistinctp.作者單位fromp)”.步驟4-3:替換多表連接查詢;對(duì)于原sql查詢語(yǔ)句中的專家表和專家所屬領(lǐng)域表的連接查詢,使用在列族e(cuò)xperts上的查詢謂詞“行業(yè)領(lǐng)域=″數(shù)據(jù)庫(kù)″”代替;步驟4-4:抽取不相關(guān)子查詢語(yǔ)句作為獨(dú)立任務(wù);在原sql查詢語(yǔ)句中,不相關(guān)子查詢及相關(guān)謂詞為:“e.所屬單位notin(selectdistinctp.作者單位fromp)”,因此將不相關(guān)子查詢“selectdistinctp.作者單位fromp”分離出來(lái),轉(zhuǎn)換為一個(gè)在對(duì)應(yīng)hbase列族上獨(dú)立執(zhí)行的sparksql語(yǔ)句“selectdistinct作者單位frompapers”;在步驟4之后,本實(shí)施例將生成兩個(gè)sparksql查詢語(yǔ)句,分別是:子查詢sparksql語(yǔ)句:selectdistinct作者單位frompapers;主查詢sparksql語(yǔ)句:select專家號(hào),專家姓名,證件號(hào)碼,所屬單位fromexpertswhere行業(yè)領(lǐng)域=“數(shù)據(jù)庫(kù)”ande.職稱in(″教授″,″副教授″,″研究員″,″副研究員″)and學(xué)術(shù)頭銜like″%院士%″oreh.學(xué)術(shù)頭銜like″%首席專家%″。步驟5:基于sparksql查詢生成spark任務(wù)并執(zhí)行該任務(wù)。本步驟的任務(wù)是生成spark引擎上的查詢?nèi)蝿?wù),并提交查詢以獲得最終查詢結(jié)果;這里采用spark引擎的主要原因包括其采用了基于rdd的內(nèi)存數(shù)據(jù)處理模式,避免內(nèi)存與硬盤之間頻繁的i/o操作;支持sql92標(biāo)準(zhǔn)的sql查詢語(yǔ)句,能夠?qū)崿F(xiàn)與關(guān)系數(shù)據(jù)上原有查詢的無(wú)縫集成;對(duì)底層數(shù)據(jù)存儲(chǔ)的良好兼容,支持hbase等多種數(shù)據(jù)存儲(chǔ)引擎;具有較強(qiáng)的并行處理能力和可擴(kuò)展性。sparksql查詢?nèi)蝿?wù)的生成主要基于查詢語(yǔ)句轉(zhuǎn)換的結(jié)果進(jìn)行,基于步驟4-4的轉(zhuǎn)換結(jié)果進(jìn)行判斷,如果沒(méi)有生成不相關(guān)子查詢的獨(dú)立任務(wù),則整體執(zhí)行轉(zhuǎn)換后的查詢語(yǔ)句,直接將轉(zhuǎn)換后的查詢語(yǔ)句作為查詢?nèi)蝿?wù)提交給sparksql引擎執(zhí)行查詢操作,執(zhí)行后結(jié)果數(shù)據(jù)以schemardd形式返回,如果生成了不相關(guān)子查詢的獨(dú)立任務(wù),則基于sparksql查詢的構(gòu)建并執(zhí)行查詢處理任務(wù)。在本實(shí)施例中,基于步驟4-4的轉(zhuǎn)換結(jié)果,其中生成了不相關(guān)子查詢的獨(dú)立sparksql查詢?nèi)蝿?wù),因此基于sparksql查詢的構(gòu)建并執(zhí)行查詢處理任務(wù)。構(gòu)建基于rdd操作的spark處理任務(wù);首先執(zhí)行子查詢,并將結(jié)果緩存在rdd中,假設(shè)rdd命名為“avoidaff”,再執(zhí)行主查詢語(yǔ)句得到候選專家集合,同樣緩存在rdd中,假設(shè)該rdd命名為“cexperts”;由于在原sql語(yǔ)句中主查詢和子查詢是通過(guò)“notin”謂詞構(gòu)建的查詢關(guān)系,因此這里使用spark的filter操作將“cexperts”rdd中專家的“所屬單位”在“avoidaff”rdd中的記錄過(guò)濾,并將結(jié)果作為最終結(jié)果輸出;待評(píng)審文章信息表p中數(shù)據(jù)如表7所示,在執(zhí)行以上查詢?nèi)蝿?wù)后,最終將輸出符合條件的評(píng)審專家為(11,張四,110867,高校7)。表7待評(píng)審文章信息表p數(shù)據(jù)表文章編號(hào)標(biāo)題文章作者作者單位1文章1作者1高校11文章2作者2高校2本實(shí)施例提供的一種基于數(shù)據(jù)模式轉(zhuǎn)換和并行框架的關(guān)系數(shù)據(jù)查詢優(yōu)化方法能夠有效提高對(duì)關(guān)系數(shù)據(jù)庫(kù)上部分頻繁執(zhí)行的復(fù)雜查詢的處理效率。最后應(yīng)說(shuō)明的是:以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案,而非對(duì)其限制;盡管參照前述實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解:其依然可以對(duì)前述實(shí)施例所記載的技術(shù)方案進(jìn)行修改,或者對(duì)其中部分或者全部技術(shù)特征進(jìn)行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明權(quán)利要求所限定的范圍。當(dāng)前第1頁(yè)12