專利名稱::查詢語句優(yōu)化裝置和查詢語句優(yōu)化方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及數(shù)據(jù)庫查詢領(lǐng)域,具體而言,涉及一種查詢語句優(yōu)化裝置和一種查詢語句優(yōu)化方法。
背景技術(shù):
:如今,數(shù)據(jù)庫已成為一個成熟軟件系統(tǒng)中不可或缺的必要組成部分,而對數(shù)據(jù)庫的查詢操作,則是數(shù)據(jù)庫系統(tǒng)中,最簡單,最常用的操作。但是隨著企業(yè)業(yè)務復雜度的不斷提高,對數(shù)據(jù)庫的查詢操作也變得越來越復雜,這就需要編寫更加復雜的數(shù)據(jù)庫查詢語句,即SQL語句,來訪問數(shù)據(jù)庫。常見的復雜SQL語句一般都包含嵌套子查詢,簡單的只嵌套一層,復雜的將會嵌套好幾層。嵌套子查詢能解決一些復雜的業(yè)務需求,但是很多時候,子查詢會包含一些冗余的字段信息,即在查詢中沒有必要出現(xiàn)的字段信息,這樣在執(zhí)行查詢時,就會影響執(zhí)行效率?,F(xiàn)有的技術(shù)優(yōu)化了表的關(guān)聯(lián)關(guān)系,和邏輯關(guān)系,但沒有優(yōu)化嵌套子查詢,即主從表的嵌套關(guān)系,不能從根本上解決SQL語句執(zhí)行上的效率問題。因此,需要一種新的技術(shù)方案,將SQL語句子查詢中的冗余字段信息過濾掉,將復雜SQL語句優(yōu)化展平,從而提高SQL語句的執(zhí)行效率。
發(fā)明內(nèi)容本發(fā)明所要解決的技術(shù)問題在于,提供一種新的技術(shù)方案,將SQL語句子查詢中的冗余字段信息過濾掉,將復雜SQL語句優(yōu)化展平,從而提高SQL語句的執(zhí)行效率。有鑒于此,本發(fā)明提供一種查詢語句優(yōu)化裝置,包括查詢定位模塊,獲取所述原始查詢語句中的外部查詢和子查詢;查詢合并模塊,將所述外部查詢和所述子查詢合并為新外部查詢;查詢語句生成模塊,根據(jù)所述新外部查詢,生成新查詢語句。應用本技術(shù)方案,可以定位至查詢語句中的外部查詢和子查詢,從而將外部查詢和子查詢進行合并操作,去掉嵌套子查詢,以實現(xiàn)展平、精簡SQL語句的目的。在上述技術(shù)方案中,優(yōu)選地,所述查詢定位模塊從所述原始查詢語句中檢索特定字符串,并根據(jù)檢索到的首個特定字符串獲取所述外部查詢,根據(jù)檢索到的其他特定字符串確定所述子查詢。應用本技術(shù)方案,根據(jù)檢索到的特定字符串的不同,獲取到外部查詢和子查詢。在上述技術(shù)方案中,優(yōu)選地,還包括冗余字段過濾模塊,獲取所述外部查詢對應的第一查詢字段和所述子查詢對應的第二查詢字段,過濾掉所述第二查詢字段中未包含在所述第一查詢字段中的字段,所述查詢合并模塊還根據(jù)所述第一查詢字段和經(jīng)過濾后的所述第二查詢字段,確定所述新外部查詢對應的查詢字段,所述查詢語句生成模塊根據(jù)所述新外部查詢以及所述新外部查詢的查詢字段,生成所述新查詢語句。應用本技術(shù)方案,對比外部查詢和子查詢的信息,可以將冗余字段過濾掉,生成精簡的查詢語句,從而提高SQL語句的執(zhí)行效率。在上述技術(shù)方案中,優(yōu)選地,還包括腳本對象化模塊,生成所述外部查詢和所述子查詢的對象,所述查詢合并模塊將所述外部查詢和所述子查詢的對象合并為新外部查詢的對象;對象腳本化模塊,根據(jù)所述新外部查詢的對象處理生成腳本,所述查詢語句生成模塊將所述腳本作為所述新查詢語句。應用本技術(shù)方案,通過腳本對象化、對象腳本化的操作,將原始的SQL語句加載到內(nèi)存中進行處理,以及將新的查詢對象導出給優(yōu)化的SQL語句。在上述技術(shù)方案中,優(yōu)選地,還包括語法校驗模塊,對所述新查詢語句進行語法校驗,并在校驗成功時輸出所述新查詢語句,在校驗失敗時輸出異常提示。應用本技術(shù)方案,新的查詢語句在語法校驗成功時,進行展平輸出,在語法校驗失敗時,輸出異常提示,從而確保展平后語句的正確性。本發(fā)明還提供了一種查詢語句優(yōu)化方法,包括步驟202,獲取所述原始查詢語句中的外部查詢和子查詢;步驟204,將所述外部查詢和所述子查詢合并為新外部查詢;步驟206,根據(jù)所述新外部查詢,生成新查詢語句。應用本技術(shù)方案,可以定位至查詢語句中的外部查詢和子查詢,從而將外部查詢和子查詢進行合并操作,去掉嵌套子查詢,以實現(xiàn)展平、精簡SQL語句的目的。在上述技術(shù)方案中,優(yōu)選地,所述步驟202包括從所述原始查詢語句中檢索特定字符串,并根據(jù)檢索到的首個特定字符串獲取所述外部查詢,根據(jù)檢索到的其他特定字符串確定所述子查詢。應用本技術(shù)方案,根據(jù)檢索到的特定字符串的不同,獲取到外部查詢和子查詢。在上述技術(shù)方案中,優(yōu)選地,還包括獲取所述外部查詢對應的第一查詢字段和所述子查詢對應的第二查詢字段,過濾掉所述第二查詢字段中未包含在所述第一查詢字段中的字段;所述步驟204還包括根據(jù)所述第一查詢字段和經(jīng)過濾后的所述第二查詢字段,確定所述新外部查詢對應的查詢字段;步驟206包括根據(jù)所述新外部查詢以及所述新外部查詢的查詢字段,生成所述新查詢語句。應用本技術(shù)方案,對比外部查詢和子查詢的信息,可以將冗余字段過濾掉,生成精簡的查詢語句,從而提高SQL語句的執(zhí)行效率。在上述技術(shù)方案中,優(yōu)選地,所述步驟202還包括生成所述外部查詢和所述子查詢的對象;所述步驟204包括將所述外部查詢和所述子查詢的對象合并為新外部查詢的對象;所述步驟206包括根據(jù)所述新外部查詢的對象處理生成腳本,并將所述腳本作為所述新查詢語句。應用本技術(shù)方案,通過腳本對象化、對象腳本化的操作,將原始的SQL語句加載到內(nèi)存中進行處理,以及將新的查詢對象導出給優(yōu)化的SQL語句。在上述技術(shù)方案中,優(yōu)選地,還包括對所述新查詢語句進行語法校驗,并在校驗成功時輸出所述新查詢語句,在校驗失敗時輸出異常提示。應用本技術(shù)方案,新的查詢語句在語法校驗成功時,進行展平輸出,在語法校驗失敗時,輸出異常提示,從而確保展平后語句的正確性。圖I示出了根據(jù)本發(fā)明的實施例的查詢語句優(yōu)化裝置框圖;圖2示出了根據(jù)本發(fā)明的實施例的查詢語句優(yōu)化方法的流程圖;圖3示出了根據(jù)本發(fā)明的實施例的查詢語句優(yōu)化的流程圖;圖4示出了根據(jù)本發(fā)明的實施例的查詢語句優(yōu)化模塊框圖5示出了根據(jù)本發(fā)明的實施例的SQL腳本對象化結(jié)構(gòu)圖;圖6示出了根據(jù)本發(fā)明的實施例的SQL對象腳本化流程圖。具體實施例方式為了能夠更清楚地理解本發(fā)明的上述目的、特征和優(yōu)點,下面結(jié)合附圖和具體實施方式對本發(fā)明進行進一步的詳細描述。在下面的描述中闡述了很多具體細節(jié)以便于充分理解本發(fā)明,但是,本發(fā)明還可以采用其他不同于在此描述的其他方式來實施,因此,本發(fā)明并不限于下面公開的具體實施例的限制。圖I示出了根據(jù)本發(fā)明的實施例的查詢語句優(yōu)化裝置框圖。如圖I所示,本發(fā)明的查詢語句優(yōu)化裝置100包括查詢定位模塊102,獲取所述·原始查詢語句中的外部查詢和子查詢;查詢合并模塊104,將所述外部查詢和所述子查詢合并為新外部查詢;查詢語句生成模塊106,根據(jù)所述新外部查詢,生成新查詢語句。應用本技術(shù)方案,可以定位至查詢語句中的外部查詢和子查詢,從而將外部查詢和子查詢進行合并操作,去掉嵌套子查詢,以實現(xiàn)展平、精簡SQL語句的目的。在上述技術(shù)方案中,優(yōu)選地,所述查詢定位模塊102從所述原始查詢語句中檢索特定字符串,并根據(jù)檢索到的首個特定字符串獲取所述外部查詢,根據(jù)檢索到的其他特定字符串確定所述子查詢。應用本技術(shù)方案,根據(jù)檢索到的特定字符串的不同,獲取到外部查詢和子查詢。在上述技術(shù)方案中,優(yōu)選地,還包括冗余字段過濾模塊108,獲取所述外部查詢對應的第一查詢字段和所述子查詢對應的第二查詢字段,過濾掉所述第二查詢字段中未包含在所述第一查詢字段中的字段,所述查詢合并模塊104還根據(jù)所述第一查詢字段和經(jīng)過濾后的所述第二查詢字段,確定所述新外部查詢對應的查詢字段,所述查詢語句生成模塊106根據(jù)所述新外部查詢以及所述新外部查詢的查詢字段,生成所述新查詢語句。應用本技術(shù)方案,通過腳本對象化、對象腳本化的操作,將原始的SQL語句加載到內(nèi)存中進行處理,及將新的查詢對象導出給優(yōu)化的SQL語句。在上述技術(shù)方案中,優(yōu)選地,還包括腳本對象化模塊110,生成所述外部查詢和所述子查詢的對象,所述查詢合并模塊104將所述外部查詢和所述子查詢的對象合并為新外部查詢的對象;對象腳本化模塊112,根據(jù)所述新外部查詢的對象處理生成腳本,所述查詢語句生成模塊106將所述腳本作為所述新查詢語句。應用本技術(shù)方案,簡化了SQL語句展平和過濾冗余字段的過程,使操作更加靈活、方便。在上述技術(shù)方案中,優(yōu)選地,還包括語法校驗模塊114,對所述新查詢語句進行語法校驗,并在校驗成功時輸出所述新查詢語句,在校驗失敗時輸出異常提示。應用本技術(shù)方案,新的查詢語句在語法校驗成功時,進行展平輸出,在語法校驗失敗時,輸出異常提示,從而確保展平后語句的正確性。圖2示出了根據(jù)本發(fā)明的實施例的查詢語句優(yōu)化方法的流程圖。如圖2所示,本發(fā)明的查詢語句優(yōu)化方法包括步驟202,獲取所述原始查詢語句中的外部查詢和子查詢;步驟204,將所述外部查詢和所述子查詢合并為新外部查詢;步驟206,根據(jù)所述新外部查詢,生成新查詢語句。應用本技術(shù)方案,可以定位至查詢語句中的外部查詢和子查詢,從而將外部查詢和子查詢進行合并操作,去掉嵌套子查詢,以實現(xiàn)展平、精簡SQL語句的目的。在上述技術(shù)方案中,優(yōu)選地,所述步驟202包括從所述原始查詢語句中檢索特定字符串,并根據(jù)檢索到的首個特定字符串獲取所述外部查詢,根據(jù)檢索到的其他特定字符串確定所述子查詢。應用本技術(shù)方案,根據(jù)檢索到的特定字符串的不同,獲取到外部查詢和子查詢。在上述技術(shù)方案中,優(yōu)選地,還包括獲取所述外部查詢對應的第一查詢字段和所述子查詢對應的第二查詢字段,過濾掉所述第二查詢字段中未包含在所述第一查詢字段中的字段;所述步驟204還包括根據(jù)所述第一查詢字段和經(jīng)過濾后的所述第二查詢字段,確定所述新外部查詢對應的查詢字段;步驟206包括根據(jù)所述新外部查詢以及所述新外部查詢的查詢字段,生成所述新查詢語句。應用本技術(shù)方案,對比外部查詢和子查詢的信息,可以將冗余字段過濾掉,生成精簡的查詢語句,從而提高SQL語句的執(zhí)行效率。在上述技術(shù)方案中,優(yōu)選地,所述步驟202還包括生成所述外部查詢和所述子查詢的對象;所述步驟204包括將所述外部查詢和所述子查詢的對象合并為新外部查詢的對象;所述步驟206包括根據(jù)所述新外部查詢的對象處理生成腳本,并將所述腳本作為所述新查詢語句。應用本技術(shù)方案,通過腳本對象化、對象腳本化的操作,將原始的SQL語句加載到內(nèi)存中進行處理,以及將新的查詢對象導出給優(yōu)化的SQL語句。在上述技術(shù)方案中,優(yōu)選地,還包括對所述新查詢語句進行語法校驗,并在校驗成功時輸出所述新查詢語句,在校驗失敗時輸出異常提示。應用本技術(shù)方案,新的查詢語句在語法校驗成功時,進行展平輸出,在語法校驗失敗時,輸出異常提示,從而確保展平后語句的正確性。圖3示出了根據(jù)本發(fā)明的實施例的查詢語句優(yōu)化的流程圖。如圖3所示,本發(fā)明的查詢語句優(yōu)化的具體流程如下步驟302,加載原始SQL語句。步驟304,使用SQL解析器將原始SQL語句解析成SQL對象。通過SQL解析器,對復雜SQL語句進行解析,將SQL腳本,解析為SQL對象,之所以做腳本對象化的處理,是因為對象操作起來比字符串更加靈活和方便。步驟306,定位原始SQL語句中的子查詢。定位SQL語句中的子查詢,同樣做對象化處理,方便后續(xù)的操作。步驟308,過濾子查詢中的冗余字段。根據(jù)外部查詢的SQL對象和子查詢的SQL對象,可以比較各個查詢的字段信息,進而判斷出哪些字段為冗余字段,冗余字段就是對查詢結(jié)果沒有任何影響的字段,這些字段沒有必要出現(xiàn)在查詢語句中,因此,為了提高SQL語句的執(zhí)行效率,將冗余字段過濾掉。步驟310,將子查詢與外部查詢合并。把子查詢和外部查詢進行合并操作,這樣就去掉了嵌套子查詢。如果有多層嵌套,每一層都采取上面的方式對其進行處理。步驟312,使用SQL翻譯器將SQL對象翻譯成標準的SQL語句。步驟314,進行SQL語法校驗。如果通過了校驗,進入步驟318;如果沒有通過校驗,進入步驟316。步驟316,拋出異常。步驟318,生成展平后的SQL語句。為了能更好的理解該方案,這里以一個簡單的例子作為輔助說明。例如有這樣一條嵌套子查詢的SQL語句selectt.a,t.b,t.cfrom(selecta,b,c,d,e,ffromt);經(jīng)過SQL解析器解析后會生成一個Select對象,字段列表包含t.a,t.b,t.c,會生成From對象,里面包含子查詢SubSelect對象,SubSelect對象的字段列表包含t.a,t.b,t.c,t.d,t.e,t.fο而這條語句最終是要查詢t表的a,b,c三個字段,子查詢中的d,e,f字段,是冗余字段,因此將他們過濾掉。然后將SubSelect和Selelct對象合并為一個Select對象,保留Select的FieldList字段和SubSelect中的Table等對象。最終,用SQL翻譯器,將新的Selelct對象翻譯為標準SQL語句selectt.a,t.b,t.cfromt。如果校驗通過,這就是最終結(jié)果。圖4示出了根據(jù)本發(fā)明的實施例的查詢語句優(yōu)化模塊框圖。如圖4所示,本發(fā)明的查詢語句優(yōu)化模塊包括SQL語句加載模塊402,SQL腳本對象化模塊404,SQL子查詢定位模塊406,SQL優(yōu)化合并模塊408,SQL對象腳本化模塊410,SQL語法校驗模塊412,通過上述模塊將SQL語句展平后輸出。各模塊詳細實現(xiàn)說明如下SQL語句加載模塊402:該模塊主要使用SQL語句加載器加載原始SQL語句。加載器實現(xiàn)簡單,就是讀取一條SQL語句,以供解析器解析使用,讀取SQL語句時不做任何處理,保持原樣。SQL腳本對象化模塊404:該模塊主要使用SQL腳本解析器解析SQL腳本。腳本解析器將一條SQL語句解析成一個Select對象,子查詢解析為SubSelect對象。其中,要查詢的字段信息,放在一個列表中保存,比如叫做FieldList。將SQL腳本解析為對象,操作更加靈活、方便。解析過程及Select對象主要結(jié)構(gòu)如圖5所示。如圖5所示,腳本被解析器解析后,按SQL語句的結(jié)構(gòu)解析出其中的select對象(定位到外部查詢)、fieldlist字段列表、from對象、table對象以及subselect對象(定位到子查詢)。SQL子查詢定位模塊406:該模塊主要使用子查詢定位器定位SQL子查詢。其實,子查詢定位的過程包含在腳本解析的過程中,如果在解析From對象的時候,判斷,如果有形如“(select%)”的字符串,就將其定義為子查詢,對應解析為SubSelect對象。SQL優(yōu)化合并模塊408:該模塊是整個展平方法的主要模塊,實現(xiàn)了過濾子查詢中冗余字段,將子查詢與外部查詢合并的功能。SQL解析時,會生成對應的Select對象和SubSelect對象,字段信息放入FieldList中保存。我們利用兩個對象的FiledList進行判斷,在SubSelect的FieldList中,而不在Select的FieldList中的,就是冗余字段,過濾掉,然后將SubSelect和Select對象合并為一個Select對象,保留Select的FieldList字段和SubSelect中的Table等對象。SQL對象腳本化模塊410:該模塊使用SQL翻譯器將合并后的Select對象,翻譯為標準的SQL語句。和解析器原理相反,其翻譯過程如圖6所示,Select對象由SQL翻譯器604輸出為標準的SQL語句606。SQL語法校驗模塊412:校驗SQL語法是否符合SQL語法規(guī)范,比如表名、字段名是否符合規(guī)范等。以上結(jié)合附圖詳細說明了本發(fā)明的技術(shù)方案。通過本發(fā)明的技術(shù)方案,根據(jù)外部查詢和子查詢,可以比較各個查詢的字段信息,進而判斷出哪些字段為冗余字段,進而將冗余字段過濾掉,提高SQL語句的執(zhí)行效率,同時,將外部查詢和子查詢進行合并操作,去掉嵌套子查詢,以實現(xiàn)展平、精簡SQL語句的目的。以上所述僅為本發(fā)明的優(yōu)選實施例而已,并不用于限制本發(fā)明,對于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應包含在本發(fā)明的保護范圍之內(nèi)。權(quán)利要求1.一種查詢語句優(yōu)化裝置,其特征在于,包括查詢定位模塊,獲取所述原始查詢語句中的外部查詢和子查詢;查詢合并模塊,將所述外部查詢和所述子查詢合并為新外部查詢;查詢語句生成模塊,根據(jù)所述新外部查詢,生成新查詢語句。2.根據(jù)權(quán)利要求I所述的查詢語句優(yōu)化裝置,其特征在于,所述查詢定位模塊從所述原始查詢語句中檢索特定字符串,并根據(jù)檢索到的首個特定字符串獲取所述外部查詢,根據(jù)檢索到的其他特定字符串確定所述子查詢。3.根據(jù)權(quán)利要求I所述的查詢語句優(yōu)化裝置,其特征在于,還包括冗余字段過濾模塊,獲取所述外部查詢對應的第一查詢字段和所述子查詢對應的第二查詢字段,過濾掉所述第二查詢字段中未包含在所述第一查詢字段中的字段,所述查詢合并模塊還根據(jù)所述第一查詢字段和經(jīng)過濾后的所述第二查詢字段,確定所述新外部查詢對應的查詢字段,所述查詢語句生成模塊根據(jù)所述新外部查詢以及所述新外部查詢的查詢字段,生成所述新查詢語句。4.根據(jù)權(quán)利要求I所述的查詢語句優(yōu)化裝置,其特征在于,還包括腳本對象化模塊,生成所述外部查詢和所述子查詢的對象,所述查詢合并模塊將所述外部查詢和所述子查詢的對象合并為新外部查詢的對象;對象腳本化模塊,根據(jù)所述新外部查詢的對象處理生成腳本,所述查詢語句生成模塊將所述腳本作為所述新查詢語句。5.根據(jù)權(quán)利要求I至4中任一項所述的查詢語句優(yōu)化裝置,其特征在于,還包括語法校驗模塊,對所述新查詢語句進行語法校驗,并在校驗成功時輸出所述新查詢語句,在校驗失敗時輸出異常提示。6.一種查詢語句優(yōu)化方法,其特征在于,包括步驟202,獲取所述原始查詢語句中的外部查詢和子查詢;步驟204,將所述外部查詢和所述子查詢合并為新外部查詢;步驟206,根據(jù)所述新外部查詢,生成新查詢語句。7.根據(jù)權(quán)利要求6所述的查詢語句優(yōu)化方法,其特征在于,所述步驟202包括從所述原始查詢語句中檢索特定字符串,并根據(jù)檢索到的首個特定字符串獲取所述外部查詢,根據(jù)檢索到的其他特定字符串確定所述子查詢。8.根據(jù)權(quán)利要求6所述的查詢語句優(yōu)化方法,其特征在于,在所述步驟204之前,還包括獲取所述外部查詢對應的第一查詢字段和所述子查詢對應的第二查詢字段,過濾掉所述第二查詢字段中未包含在所述第一查詢字段中的字段;所述步驟204還包括根據(jù)所述第一查詢字段和經(jīng)過濾后的所述第二查詢字段,確定所述新外部查詢對應的查詢字段;步驟206包括根據(jù)所述新外部查詢以及所述新外部查詢的查詢字段,生成所述新查詢語句。9.根據(jù)權(quán)利要求6所述的查詢語句優(yōu)化方法,其特征在于,所述步驟202還包括生成所述外部查詢和所述子查詢的對象;所述步驟204包括將所述外部查詢和所述子查詢的對象合并為新外部查詢的對象;所述步驟206包括根據(jù)所述新外部查詢的對象處理生成腳本,并將所述腳本作為所述新查詢語句。10.根據(jù)權(quán)利要求6至9中任一項所述的查詢語句優(yōu)化方法,其特征在于,還包括對所述新查詢語句進行語法校驗,并在校驗成功時輸出所述新查詢語句,在校驗失敗時輸出異常提示。全文摘要本發(fā)明提供一種查詢語句優(yōu)化裝置,包括查詢定位模塊,獲取所述原始查詢語句中的外部查詢和子查詢;查詢合并模塊,將所述外部查詢和所述子查詢合并為新外部查詢;查詢語句生成模塊,根據(jù)所述新外部查詢,生成新查詢語句。相應地,本發(fā)明還提供一種查詢語句優(yōu)化方法。應用本技術(shù)方案,根據(jù)外部查詢和子查詢,可以比較各個查詢的字段信息,進而判斷出哪些字段為冗余字段,進而將冗余字段過濾掉,提高SQL語句的執(zhí)行效率,同時,將外部查詢和子查詢進行合并操作,去掉嵌套子查詢,以實現(xiàn)展平、精簡SQL語句的目的。文檔編號G06F17/30GK102902778SQ201210370960公開日2013年1月30日申請日期2012年9月28日優(yōu)先權(quán)日2012年9月28日發(fā)明者張一桐申請人:用友軟件股份有限公司