摘 要: 針對(duì)DOT系統(tǒng),設(shè)計(jì)實(shí)現(xiàn)并優(yōu)化了類SQL的查詢技術(shù),首先分析了傳統(tǒng)數(shù)據(jù)庫(kù)在查詢上的優(yōu)化策略,比較了傳統(tǒng)數(shù)據(jù)庫(kù)和DOT系統(tǒng)在查詢方面的異同。通過(guò)參考一般數(shù)據(jù)庫(kù)的SQL語(yǔ)句的設(shè)計(jì)規(guī)范,為DOT設(shè)計(jì)了一套類SQL語(yǔ)句。后續(xù)對(duì)設(shè)計(jì)的類SQL語(yǔ)句進(jìn)行詞法語(yǔ)法分析,構(gòu)建查詢樹(shù)。同時(shí),借鑒傳統(tǒng)數(shù)據(jù)庫(kù)的查詢優(yōu)化策略,結(jié)合DOT系統(tǒng)的特點(diǎn)對(duì)查詢進(jìn)行優(yōu)化。最后在開(kāi)源的ApacheHBase典型的DOT系統(tǒng)的基礎(chǔ)上,實(shí)現(xiàn)了上述類SQL語(yǔ)句的所有解析和優(yōu)化內(nèi)容。
關(guān)鍵詞: 分布式順序表; 類SQL語(yǔ)句; 查詢優(yōu)化; HBase索引優(yōu)化
中圖分類號(hào): TN911?34; TM417 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2016)15?0103?05
Abstract: Aiming at the distributed ordered table (DOT) system, the SQL?like query technology was designed, implemented and optimized. In this paper, the optimization strategy of the traditional database is analyzed for query, and the query differences between the DOT system and traditional database are compared. Referring to the design specifications of the general database′s SQL statement, a set SQL?like statement was designed for DOT. The designed SQL?like statement is analyzed with morphology and grammar to establish the query tree. In combination with the query optimization scheme of the traditional database and cha?racteristics of DOT system, the query was optimized. All analysis and optimization contents of SQL?like statement were realized based on the open source ApacheHBase.
Keywords: distributed ordered table; SQL?like statement; query optimization; HBase index optimization
0 引 言
網(wǎng)絡(luò)應(yīng)用的普及對(duì)海量數(shù)據(jù)的存儲(chǔ)和操作處理以及各種處理能力的可擴(kuò)展性、可靠性和高效性提出了很大的挑戰(zhàn),而現(xiàn)有數(shù)據(jù)模型和相關(guān)技術(shù)已不能勝任[1]。為了應(yīng)對(duì)上述挑戰(zhàn),業(yè)界提出了NoSQL數(shù)據(jù)庫(kù)。這些NoSQL數(shù)據(jù)庫(kù)可以模型化為分布式順序表(DOT)系統(tǒng),但是DOT系統(tǒng)對(duì)SQL規(guī)范中查詢特性的支持并不完美[2]。
隨著網(wǎng)絡(luò)的發(fā)展,數(shù)據(jù)量出現(xiàn)爆炸式的增長(zhǎng),現(xiàn)有的關(guān)系型數(shù)據(jù)庫(kù)處理這些大數(shù)據(jù)已經(jīng)出現(xiàn)瓶頸。進(jìn)而有了DOT系統(tǒng)的出現(xiàn),但現(xiàn)有的DOT系統(tǒng)對(duì)SQL查詢特性的支持并不是特別的理想[3]。
1 類SQL語(yǔ)句的設(shè)計(jì)與解析實(shí)現(xiàn)
在實(shí)現(xiàn)過(guò)程中首先根據(jù)SQL的設(shè)計(jì)規(guī)范,設(shè)計(jì)出一套適用于DOT系統(tǒng)的類SQL語(yǔ)句。用戶根據(jù)類SQL規(guī)范提交查詢請(qǐng)求,然后系統(tǒng)對(duì)類SQL查詢語(yǔ)句進(jìn)行詞法分析、語(yǔ)法分析和語(yǔ)義分析,建立原始查詢樹(shù)。最后根據(jù)DOT的特點(diǎn)實(shí)現(xiàn)查詢樹(shù)的優(yōu)化。對(duì)于語(yǔ)法分析中各操作語(yǔ)句類型的判斷,采取保留類SQL語(yǔ)句第一個(gè)關(guān)鍵詞的方法進(jìn)行查詢類型的匹配來(lái)識(shí)別具體的查詢類型的方法來(lái)實(shí)現(xiàn)。類SQL語(yǔ)句解析流程如圖1所示。
1.1 查詢關(guān)系式的詞法分析
利用有限自動(dòng)機(jī)的方法對(duì)識(shí)別過(guò)程進(jìn)行建模。通過(guò)詞法分析自動(dòng)機(jī)對(duì)where_list查詢條件進(jìn)行分析后就能夠得到查詢條件中的所有關(guān)鍵詞,然后根據(jù)關(guān)鍵字出現(xiàn)的順序確定輸入是否符合語(yǔ)法分析的語(yǔ)法規(guī)定。根據(jù)需求,本自動(dòng)機(jī)識(shí)別的關(guān)鍵字有關(guān)系符號(hào)、括號(hào)、整數(shù)、浮點(diǎn)數(shù)、字符串值、變量名[6]。
詞法分析的結(jié)果記錄在下面三個(gè)數(shù)組中:
keyWordList[wordIndex],記錄condition條件中的查詢列。
keyValueList[valueIndex]=searSQL.substring(begIndex,endIndex),記錄查詢列的起始范圍的值。
keyValueType[valueIndex]=DataType,記錄查詢列的范圍值的數(shù)據(jù)類型。
stokenList[listIndex++],記錄condition條件中出現(xiàn)的每一個(gè)字符的標(biāo)記token,token分為五類:邏輯與或非,查詢條件列,條件列范圍的起始值,范圍起始值的類型和比較符號(hào)。
1.2 查詢關(guān)系式的語(yǔ)法分析
類SQL語(yǔ)句和傳統(tǒng)的SQL語(yǔ)句類似,包含固定的關(guān)鍵字和各關(guān)鍵字的出現(xiàn)順序,并且每個(gè)關(guān)鍵字所起的引導(dǎo)作用也很清晰。本系統(tǒng)中的類SQL的語(yǔ)法表即是通過(guò)正則表達(dá)式實(shí)現(xiàn)的。語(yǔ)法中定義了類SQL語(yǔ)句的各關(guān)鍵詞的出現(xiàn)順序,并根據(jù)不同的關(guān)鍵字觸發(fā)不同的動(dòng)作。
在語(yǔ)法分析中還包括對(duì)查詢條件中括號(hào)的匹配。待整個(gè)SQL語(yǔ)句的語(yǔ)法語(yǔ)義分析正確后,將語(yǔ)句中涉及的語(yǔ)法正確的tablename,select_list,condition等信息存儲(chǔ)到響應(yīng)的string數(shù)組里面。在詞法語(yǔ)法分析正確的基礎(chǔ)上對(duì)SQL語(yǔ)句中涉及的表和列是否存在部分完整性檢查,如有錯(cuò)誤,即時(shí)反饋錯(cuò)誤信息。
1.3 查詢樹(shù)的構(gòu)建
文中類SQL的查詢關(guān)系式查詢樹(shù)的構(gòu)建是用二叉查詢樹(shù)構(gòu)建的。建立的二叉查詢樹(shù)為中序遍歷二叉樹(shù),通過(guò)對(duì)查詢樹(shù)進(jìn)行中序遍歷可以得到查詢關(guān)系式。在查詢樹(shù)的構(gòu)建中,根據(jù)二叉樹(shù)的特點(diǎn)采用遞歸算法,先判斷出左右子樹(shù)的范圍并完成構(gòu)建,然后完成其父節(jié)點(diǎn)的構(gòu)建,組成樹(shù)結(jié)構(gòu)。
2 查詢樹(shù)的優(yōu)化
DOT系統(tǒng)為分布式結(jié)構(gòu),所有的數(shù)據(jù)均存儲(chǔ)在集群中,在并行操作中具有很強(qiáng)的性能優(yōu)勢(shì)。為了提高查詢統(tǒng)計(jì)的速度,讓查詢開(kāi)啟多線程進(jìn)行并行化查詢是較好的解決方案。本文并行化的解決方案是將查詢關(guān)系式解析成析取范式的形式,程序?yàn)槊恳粋€(gè)析取項(xiàng)啟動(dòng)一個(gè)查詢線程,首先將查詢關(guān)系式轉(zhuǎn)化成析取范式矩陣。為了不讓并行化執(zhí)行的查詢進(jìn)程之間出現(xiàn)重復(fù)的結(jié)果,即并行化執(zhí)行的析取查詢項(xiàng)之間沒(méi)有交集,最后需要將查詢關(guān)系式解析成等價(jià)的主析取范式矩陣。
2.1 查詢關(guān)系式并行化優(yōu)化
2.1.1 查詢關(guān)系式優(yōu)化成析取范式矩陣
對(duì)整個(gè)二叉查詢樹(shù)的優(yōu)化算法思想為:
(1) 自根節(jié)點(diǎn)遍歷整個(gè)查詢樹(shù);
(2) 如果沒(méi)有發(fā)現(xiàn)父節(jié)點(diǎn)是and節(jié)點(diǎn)或or節(jié)點(diǎn)則優(yōu)化完成,程序返回;否則,定義發(fā)現(xiàn)的or節(jié)點(diǎn)為當(dāng)前節(jié)點(diǎn),跳轉(zhuǎn)到(3);
(3) 對(duì)當(dāng)前節(jié)點(diǎn)的各個(gè)分支按下文中三種邏輯節(jié)點(diǎn)(與或非)中的一種進(jìn)行方式轉(zhuǎn)換,對(duì)查詢樹(shù)進(jìn)行旋轉(zhuǎn),完成后跳轉(zhuǎn)到(1)。
對(duì)查詢樹(shù)的優(yōu)化采用遞歸調(diào)用的流程來(lái)實(shí)現(xiàn),對(duì)于每一個(gè)節(jié)點(diǎn)采用先優(yōu)化左子樹(shù),再優(yōu)化右子樹(shù),后優(yōu)化當(dāng)前節(jié)點(diǎn)的優(yōu)化流程。
2.1.2 查詢關(guān)系式邏輯“或”節(jié)點(diǎn)的優(yōu)化
邏輯“或”節(jié)點(diǎn)的優(yōu)化和邏輯“與”節(jié)點(diǎn)的優(yōu)化不同。它只有當(dāng)其左右孩子都為數(shù)據(jù)節(jié)點(diǎn)且數(shù)據(jù)節(jié)點(diǎn)為同一個(gè)變量的表達(dá)式的情況下,邏輯“或”節(jié)點(diǎn)才需要進(jìn)行優(yōu)化。如圖2為整棵樹(shù)的一部分,節(jié)點(diǎn)[B]為邏輯節(jié)點(diǎn),節(jié)點(diǎn)[m]和[n]為數(shù)據(jù)節(jié)點(diǎn),[A]節(jié)點(diǎn)為[B]節(jié)點(diǎn)的父節(jié)點(diǎn)。