本發(fā)明涉及數(shù)據(jù)庫技術(shù)領(lǐng)域,具體而言,涉及一種半連接合并方法和一種半連接合并裝置。
背景技術(shù):
在數(shù)據(jù)庫處理SQL(Structured Query Language,結(jié)構(gòu)化查詢語言)語句的過程主要分為三個(gè)階段:一、語法分析階段,在這個(gè)階段,數(shù)據(jù)庫(數(shù)據(jù)倉庫)將來自客戶端的SQL語句,借助語法解析工具轉(zhuǎn)換成數(shù)據(jù)庫(數(shù)據(jù)倉庫)可以識(shí)別的數(shù)據(jù)結(jié)構(gòu),即轉(zhuǎn)換成語法分析樹;二、查詢優(yōu)化階段,在這個(gè)階段,數(shù)據(jù)庫(數(shù)據(jù)倉庫)在詞法語法分析樹上施加各種優(yōu)化的方法(也就是數(shù)據(jù)庫中常見的查詢改寫),然后為參與連接的表計(jì)算出一條最優(yōu)的訪問路徑,最終生成一個(gè)結(jié)構(gòu)來表示最優(yōu)的查詢計(jì)劃;三、執(zhí)行查詢計(jì)劃階段,執(zhí)行最優(yōu)的查詢計(jì)劃,最終獲得結(jié)果。
其中,在查詢優(yōu)化階段,會(huì)對(duì)語法分析樹進(jìn)行各種優(yōu)化。在這些優(yōu)化策略中,有一項(xiàng)就是將IN語句或是EXIST語句改寫成半連接語句并上拉。這樣做的好處在于:將IN語句或EXIST語句改寫成半連接之后,可以提供更多機(jī)會(huì)來發(fā)現(xiàn)代價(jià)更小的訪問路徑,最終獲得更優(yōu)的查詢計(jì)劃。
目前的數(shù)據(jù)庫(數(shù)據(jù)倉庫)中提供的針對(duì)IN語句或EXIST語句的半連接優(yōu)化,一個(gè)主要的問題是沒有考慮到將半連接進(jìn)行合并。在某些情況下,復(fù)雜的SQL語句中,是存在多個(gè)半連接合并的可能性的。而現(xiàn)在有的數(shù)據(jù)庫(數(shù)據(jù)倉庫)中,沒有對(duì)半連接進(jìn)行合并,這就會(huì)帶來如下兩點(diǎn)的缺陷:
(1)在查詢優(yōu)化階段,搜索訪問路徑時(shí),一般采用了動(dòng)態(tài)規(guī)劃算法,該動(dòng)態(tài)規(guī)劃算法的復(fù)雜度與參與連接的表的數(shù)量成指數(shù)級(jí)關(guān)系,因此多一個(gè)表,就會(huì)增大若干倍的搜索空間,從而相應(yīng)地增大搜索代價(jià)。
(2)執(zhí)行查詢計(jì)劃階段,會(huì)增加訪問物理表的次數(shù)以及增大重復(fù)的謂詞表達(dá)式的計(jì)算,最終增大了磁盤的IO壓力和CPU資源的消耗。
因此,如何實(shí)現(xiàn)對(duì)半連接進(jìn)行合并,以在查詢優(yōu)化階段縮小搜索空間和在執(zhí)行查詢計(jì)劃階段減少訪問物理表的次數(shù)和減少重復(fù)的謂詞表達(dá)式的計(jì)算成為亟待解決的技術(shù)問題。
技術(shù)實(shí)現(xiàn)要素:
為此,本發(fā)明的一個(gè)目的在于提出了一種半連接合并方法。
本發(fā)明的另一個(gè)目的在于提出了一種半連接合并裝置。
為實(shí)現(xiàn)上述至少一個(gè)目的,根據(jù)本發(fā)明的第一方面的實(shí)施例,提出了一種半連接合并方法,包括:在SQL語法分析樹中查詢匹配子查詢的半連接;若匹配所述子查詢的半連接的語句和所述子查詢的語句均是第一類型語句和第二類型語句的其中一種語句,則根據(jù)所述該種語句確定待合并的第一謂詞表達(dá)式;判斷該種語句轉(zhuǎn)化成的半連接和匹配所述子查詢的半連接的類型是否相同;若相同,則將所述第一謂詞表達(dá)式與匹配所述子查詢的半連接中的過濾條件進(jìn)行合并;以及若不相同,則對(duì)所述第一謂詞表達(dá)式進(jìn)行取反,并將取反后的第一謂詞表達(dá)式與匹配所述子查詢的半連接中的過濾條件進(jìn)行合并。
在該技術(shù)方案中,通過將第一謂詞表達(dá)式與匹配子查詢的半連接中的過濾條件進(jìn)行合并,由于謂詞表達(dá)式中的有半連接,因此,通過以上的合并可以將兩個(gè)半連接合并成一個(gè)半連接來獲得最優(yōu)的查詢計(jì)劃。通過以上方案,一方面減少了半連接的數(shù)量,從而減少了參與連接的表的數(shù)量,因此在查詢優(yōu)化階段搜索最優(yōu)的表的訪問路徑時(shí),會(huì)縮小搜索空間,進(jìn)而減小生成最優(yōu)訪問路徑的時(shí)間,最終能減少生成查詢計(jì)劃的時(shí)間。另一方面,可以得到一個(gè)更優(yōu)化的查詢計(jì)劃,合并之后的半連接中的謂詞表達(dá)式的選擇率更加小,并且半連接的數(shù)量也會(huì)減少,這樣在執(zhí)行查詢計(jì)劃階段,不但能減少對(duì)物理表的訪問和減少相應(yīng)的磁盤IO,而且還因?yàn)橹^詞表達(dá)式的合并,可以減少重復(fù)的謂詞表達(dá)式的計(jì)算,從而大大節(jié)約了CPU的開銷。
在上述技術(shù)方案中,優(yōu)選地,所述在SQL語法分析樹中查詢匹配子查詢的半連接的步驟,包括:遍歷所述SQL語法分析樹,以確定所述SQL語法分析樹中的半連接和所述子查詢是否滿足匹配條件;若所述SQL語法分析樹中的半連接和所述子查詢滿足所述匹配條件,則將所述SQL語法分析樹中的滿足所述匹配條件的半連接作為匹配所述子查詢的半連接;其中,所述匹配條件包括:所述SQL語法分析樹中的半連接的語句和所述子查詢的語句均是所述第一類型語句或者所述第二類型語句、所述SQL語法分析樹中的半連接的標(biāo)識(shí)碼和所述子查詢的標(biāo)識(shí)碼相同以及與所述子查詢關(guān)聯(lián)的主查詢的第二謂詞表達(dá)式中所引用所述主查詢的列和所述SQL語法分析樹中的半連接的連接條件上引用的所述主查詢的列相同。
在該技術(shù)方案中,通過遍歷SQL語法分析樹,以在SQL語法分析樹中更加全面、準(zhǔn)確地查詢出與子查詢滿足匹配條件的半連接。
在上述任一技術(shù)方案中,優(yōu)選地,所述在SQL語法分析樹中查詢匹配子查詢的半連接的步驟之前,所述半連接合并方法還包括:獲取所述子查詢的語法分析樹中的多個(gè)關(guān)鍵字段;根據(jù)所述多個(gè)關(guān)鍵字段,生成所述子查詢的標(biāo)識(shí)碼。
在該技術(shù)方案中,通過子查詢的語法分析樹中的多個(gè)關(guān)鍵字段生成子查詢的標(biāo)識(shí)碼,從而根據(jù)該子查詢的標(biāo)識(shí)碼可以快速地在SQL語法分析樹中查詢出與子查詢滿足匹配條件的半連接。
在上述任一技術(shù)方案中,優(yōu)選地,若匹配所述子查詢的半連接的語句和所述子查詢的語句均是第一類型語句和第二類型語句的其中一種語句,則根據(jù)該種語句確定待合并的第一謂詞表達(dá)式的步驟,包括:若匹配所述子查詢的半連接的語句和所述子查詢的語句均是所述第一類型語句,則將所述第一類型語句中的過濾條件作為所述第一謂詞表達(dá)式;若匹配所述子查詢的半連接的語句和所述子查詢的語句均是所述第二類型語句,則將所述第二類型語句中的過濾條件作為所述第一謂詞表達(dá)式。
在上述任一技術(shù)方案中,優(yōu)選地,所述半連接合并方法還包括:若在所述SQL語法分析樹中未查詢到匹配所述子查詢的半連接,則將所述子查詢作為半連接加入到所述SQL語法分析樹中;以及若匹配所述子查詢的半連接的語句和所述子查詢的語句均不是所述第一類型語句或者所述第二類型語句,則將所述子查詢作為半連接加入到所述SQL語法分析樹中。
在該技術(shù)方案中,在未查詢到匹配子查詢的半連接,或者匹配子查詢的半連接的語句和子查詢的語句均不是第一類型語句或者第二類型語句時(shí),將子查詢作為半連接加入到SQL語法分析樹中,從而保證了半連接合并時(shí)的可靠性。
在上述任一技術(shù)方案中,優(yōu)選地,所述第一類型語句包括:IN語句和/或ANY語句;所述第二類型語句包括:EXIST語句。
在該技術(shù)方案中,第一類型語句包括:IN語句和/或ANY語句,第二類型語句包括:EXIST語句,從而實(shí)現(xiàn)對(duì)IN語句、ANY語句和EXIST語句的半連接的合并。
本發(fā)明的第二方面提出了一種半連接合并裝置,包括:查詢單元,用于在SQL語法分析樹中查詢匹配子查詢的半連接;確定單元,用于若匹配所述子查詢的半連接的語句和所述子查詢的語句均是第一類型語句和第二類型語句的其中一種語句,則根據(jù)該種語句確定待合并的第一謂詞表達(dá)式;判斷單元,用于判斷該種語句轉(zhuǎn)化成的半連接和匹配所述子查詢的半連接的類型是否相同;合并單元,用于若所述判斷單元判定該種語句轉(zhuǎn)化成的半連接和匹配所述子查詢的半連接的類型相同,則將所述第一謂詞表達(dá)式與匹配所述子查詢的半連接中的過濾條件進(jìn)行合并;以及所述合并單元還用于,若所述判斷單元判定該種語句轉(zhuǎn)化成的半連接和匹配所述子查詢的半連接的類型不相同,則對(duì)所述第一謂詞表達(dá)式進(jìn)行取反,并將取反后的第一謂詞表達(dá)式與匹配所述子查詢的半連接中的過濾條件進(jìn)行合并。
在該技術(shù)方案中,通過將第一謂詞表達(dá)式與匹配子查詢的半連接中的過濾條件進(jìn)行合并,由于謂詞表達(dá)式中的有半連接,因此,通過以上的合并可以將兩個(gè)半連接合并成一個(gè)半連接來獲得最優(yōu)的查詢計(jì)劃。通過以上方案,一方面減少了半連接的數(shù)量,從而減少了參與連接的表的數(shù)量,因此在查詢優(yōu)化階段搜索最優(yōu)的表的訪問路徑時(shí),會(huì)縮小搜索空間,進(jìn)而減小生成最優(yōu)訪問路徑的時(shí)間,最終能減少生成查詢計(jì)劃的時(shí)間。另一方面,可以得到一個(gè)更優(yōu)化的查詢計(jì)劃,合并之后的半連接中的謂詞表達(dá)式的選擇率更加小,并且半連接的數(shù)量也會(huì)減少,這樣在執(zhí)行查詢計(jì)劃階段,不但能減少對(duì)物理表的訪問和減少相應(yīng)的磁盤IO,而且還因?yàn)橹^詞表達(dá)式的合并,可以減少重復(fù)的謂詞表達(dá)式的計(jì)算,從而大大節(jié)約了CPU的開銷。
在上述技術(shù)方案中,優(yōu)選地,所述查詢單元包括:確定子單元,用于遍歷所述SQL語法分析樹,以確定所述SQL語法分析樹中的半連接和所述子查詢是否滿足匹配條件;所述確定子單元還用于,若所述SQL語法分析樹中的半連接和所述子查詢滿足所述匹配條件,則將所述SQL語法分析樹中的滿足所述匹配條件的半連接作為匹配所述子查詢的半連接;其中,所述匹配條件包括:所述SQL語法分析樹中的半連接的語句和所述子查詢的語句均是所述第一類型語句或者所述第二類型語句、所述SQL語法分析樹中的半連接的標(biāo)識(shí)碼和所述子查詢的標(biāo)識(shí)碼相同以及與所述子查詢關(guān)聯(lián)的主查詢的第二謂詞表達(dá)式中所引用所述主查詢的列和所述SQL語法分析樹中的半連接的連接條件上引用的所述主查詢的列相同。
在該技術(shù)方案中,通過遍歷SQL語法分析樹,以在SQL語法分析樹中更加全面、準(zhǔn)確地查詢出與子查詢滿足匹配條件的半連接。
在上述任一技術(shù)方案中,優(yōu)選地,所述半連接合并裝置還包括:所述半連接合并裝置還包括:獲取單元,用于獲取所述子查詢的語法分析樹中的多個(gè)關(guān)鍵字段;生成單元,用于根據(jù)所述多個(gè)關(guān)鍵字段,生成所述子查詢的標(biāo)識(shí)碼。
在該技術(shù)方案中,通過子查詢的語法分析樹中的多個(gè)關(guān)鍵字段生成子查詢的標(biāo)識(shí)碼,從而根據(jù)該子查詢的標(biāo)識(shí)碼可以快速地在SQL語法分析樹中查詢出與子查詢滿足匹配條件的半連接。
在上述任一技術(shù)方案中,優(yōu)選地,所述確定單元具體用于,若匹配所述子查詢的半連接的語句和所述子查詢的語句均是所述第一類型語句,則將所述第一類型語句中的過濾條件作為所述第一謂詞表達(dá)式;若匹配所述子查詢的半連接的語句和所述子查詢的語句均是所述第二類型語句,則將所述第二類型語句中的過濾條件作為所述第一謂詞表達(dá)式。
在上述任一技術(shù)方案中,優(yōu)選地,所述半連接合并裝置還包括:加入單元,用于若所述查詢單元在所述SQL語法分析樹中未查詢到匹配所述子查詢的半連接,則將所述子查詢作為半連接加入到所述SQL語法分析樹中;以及所述加入單元還用于,若匹配所述子查詢的半連接的語句和所述子查詢的語句均不是所述第一類型語句或者所述第二類型語句,則將所述子查詢作為半連接加入到所述SQL語法分析樹中。
在該技術(shù)方案中,在未查詢到匹配子查詢的半連接,或者匹配子查詢的半連接的語句和子查詢的語句均不是第一類型語句或者第二類型語句時(shí),將子查詢作為半連接加入到SQL語法分析樹中,從而保證了半連接合并時(shí)的可靠性。
在上述任一技術(shù)方案中,優(yōu)選地,所述第一類型語句包括:IN語句和/或ANY語句;所述第二類型語句包括:EXIST語句。
在該技術(shù)方案中,第一類型語句包括:IN語句和/或ANY語句,第二類型語句包括:EXIST語句,從而實(shí)現(xiàn)對(duì)IN語句、ANY語句和EXIST語句的半連接的合并。
通過本發(fā)明的技術(shù)方案,通過對(duì)半連接進(jìn)行合并,以在查詢優(yōu)化階段縮小搜索空間和在執(zhí)行查詢計(jì)劃階段減少訪問物理表的次數(shù)和減少重復(fù)的謂詞表達(dá)式的計(jì)算。
附圖說明
圖1示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的半連接合并方法的流程示意圖;
圖2示出了根據(jù)本發(fā)明的另一個(gè)實(shí)施例的半連接合并方法的流程示意圖;
圖3示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的半連接合并裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
為了可以更清楚地理解本發(fā)明的上述目的、特征和優(yōu)點(diǎn),下面結(jié)合附圖和具體實(shí)施方式對(duì)本發(fā)明進(jìn)行進(jìn)一步的詳細(xì)描述。需要說明的是,在不沖突的情況下,本申請(qǐng)的實(shí)施例及實(shí)施例中的特征可以相互組合。
在下面的描述中闡述了很多具體細(xì)節(jié)以便于充分理解本發(fā)明,但是,本發(fā)明還可以采用其他不同于在此描述的其他方式來實(shí)施,因此,本發(fā)明的保護(hù)范圍并不受下面公開的具體實(shí)施例的限制。
圖1示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的半連接合并方法的流程示意圖。
如圖1所示,根據(jù)本發(fā)明的一個(gè)實(shí)施例的半連接合并方法,包括:
步驟102,在SQL語法分析樹中查詢匹配子查詢的半連接。
優(yōu)選地,步驟102包括:遍歷所述SQL語法分析樹,以確定所述SQL語法分析樹中的半連接和所述子查詢是否滿足匹配條件;若所述SQL語法分析樹中的半連接和所述子查詢滿足所述匹配條件,則將所述SQL語法分析樹中的滿足所述匹配條件的半連接作為匹配所述子查詢的半連接;其中,所述匹配條件包括:所述SQL語法分析樹中的半連接的語句和所述子查詢的語句均是第一類型語句或者第二類型語句、所述SQL語法分析樹中的半連接的標(biāo)識(shí)碼和所述子查詢的標(biāo)識(shí)碼相同以及與所述子查詢關(guān)聯(lián)的主查詢的第二謂詞表達(dá)式中所引用所述主查詢的列和所述SQL語法分析樹中的半連接的連接條件上引用的所述主查詢的列相同。
通過遍歷SQL語法分析樹,以在SQL語法分析樹中更加全面、準(zhǔn)確地查詢出與子查詢滿足匹配條件的半連接。
優(yōu)選地,所述第一類型語句包括:IN語句和/或ANY語句;所述第二類型語句包括:EXIST語句。第一類型語句和第二類型語句中可能會(huì)含有可以轉(zhuǎn)化成半連接的語法分析樹。
優(yōu)選地,在步驟102之前,半連接合并方法還包括:獲取所述子查詢的語法分析樹中的多個(gè)關(guān)鍵字段;根據(jù)所述多個(gè)關(guān)鍵字段,生成所述子查詢的標(biāo)識(shí)碼。
例如,將子查詢的語法分析樹中的多個(gè)關(guān)鍵字段合并成一個(gè)總字段;使用無符號(hào)的整形數(shù)(例如,64位的整形數(shù))對(duì)總字段進(jìn)行編碼,以將總字段的編碼作為子查詢的標(biāo)識(shí)碼。
再例如,使用無符號(hào)的整形數(shù)(例如,64位的整形數(shù)),分別對(duì)子查詢的語法分析樹中的多個(gè)關(guān)鍵字段中的每個(gè)關(guān)鍵字段進(jìn)行編碼,將多個(gè)關(guān)鍵字段的編碼進(jìn)行合并,將合并得到的編碼作為子查詢的標(biāo)識(shí)碼。通過子查詢的語法分析樹中的多個(gè)關(guān)鍵字段生成子查詢的標(biāo)識(shí)碼并存儲(chǔ)在該子查詢的語法分析樹中,從而根據(jù)該子查詢的標(biāo)識(shí)碼可以快速地在SQL語法分析樹中查詢出與子查詢滿足匹配條件的半連接。
步驟104,若匹配所述子查詢的半連接的語句和所述子查詢的語句均是第一類型語句和第二類型語句的其中一種語句,則根據(jù)該種語句確定待合并的第一謂詞表達(dá)式。
優(yōu)選地,步驟104包括:若匹配所述子查詢的半連接的語句和所述子查詢的語句均是所述第一類型語句,則將所述第一類型語句中的過濾條件作為所述第一謂詞表達(dá)式;若匹配所述子查詢的半連接的語句和所述子查詢的語句均是所述第二類型語句,則將所述第二類型語句中的過濾條件作為所述第一謂詞表達(dá)式。
優(yōu)選地,半連接合并方法還包括:若在所述SQL語法分析樹中未查詢到匹配所述子查詢的半連接,則將所述子查詢作為半連接加入到所述SQL語法分析樹中;以及若匹配所述子查詢的半連接的語句和所述子查詢的語句均不是所述第一類型語句或者所述第二類型語句,則將所述子查詢作為半連接加入到所述SQL語法分析樹中。
在未查詢到匹配子查詢的半連接,或者匹配子查詢的半連接的語句和子查詢的語句均不是第一類型語句或者第二類型語句時(shí),將子查詢作為半連接加入到SQL語法分析樹中,從而保證了半連接合并時(shí)的可靠性。
步驟106,判斷該種語句轉(zhuǎn)化成的半連接和匹配所述子查詢的半連接的類型是否相同,若判定該種語句轉(zhuǎn)化成的半連接和匹配所述子查詢的半連接的類型相同,則執(zhí)行步驟108,若判定該種語句轉(zhuǎn)化成的半連接和匹配所述子查詢的半連接的類型不相同,則執(zhí)行步驟110。
步驟108,將所述第一謂詞表達(dá)式與匹配所述子查詢的半連接中的過濾條件進(jìn)行合并。
步驟110,對(duì)所述第一謂詞表達(dá)式進(jìn)行取反,并將取反后的第一謂詞表達(dá)式與匹配所述子查詢的半連接中的過濾條件進(jìn)行合并。
其中,步驟110包括:通過為第一謂詞表達(dá)式生成新的第一謂詞表達(dá)式,該新的第一謂詞表達(dá)式中的操作符是NOT,該新的第一謂詞表達(dá)式即為取反后的第一謂詞表達(dá)式。
在該技術(shù)方案中,通過將第一謂詞表達(dá)式與匹配子查詢的半連接中的過濾條件進(jìn)行合并,由于謂詞表達(dá)式中的有半連接,因此,通過以上的合并可以將兩個(gè)半連接合并成一個(gè)半連接來獲得最優(yōu)的查詢計(jì)劃。通過以上方案,一方面減少了半連接的數(shù)量,從而減少了參與連接的表的數(shù)量,因此在查詢優(yōu)化階段搜索最優(yōu)的表的訪問路徑時(shí),會(huì)縮小搜索空間,進(jìn)而減小生成最優(yōu)訪問路徑的時(shí)間,最終能減少生成查詢計(jì)劃的時(shí)間。另一方面,可以得到一個(gè)更優(yōu)化的查詢計(jì)劃,合并之后的半連接中的謂詞表達(dá)式的選擇率更加小,并且半連接的數(shù)量也會(huì)減少,這樣在執(zhí)行查詢計(jì)劃階段,不但能減少對(duì)物理表的訪問和減少相應(yīng)的磁盤IO,而且還因?yàn)橹^詞表達(dá)式的合并,可以減少重復(fù)的謂詞表達(dá)式的計(jì)算,從而大大節(jié)約了CPU的開銷。
圖2示出了根據(jù)本發(fā)明的另一個(gè)實(shí)施例的半連接合并方法的流程示意圖。
如圖2所示,根據(jù)本發(fā)明的另一個(gè)實(shí)施例的半連接合并方法,包括:
步驟202,遍歷SQL語法分析樹的過濾條件,從該過濾條件中找出第一類型語句和第二類型語句。其中,第一類型語句包括:IN語句和/或ANY語句;第二類型語句包括:EXIST語句。
步驟204,為子查詢生成標(biāo)識(shí)碼,并將子查詢的標(biāo)識(shí)碼存儲(chǔ)到子查詢的語法分析樹中。
步驟206,遍歷SQL語法分析樹,判斷是否查詢出匹配子查詢的半連接,若判定查詢出匹配子查詢的半連接,則執(zhí)行步驟208,若判定未查詢出匹配子查詢的半連接,則執(zhí)行步驟210。
其中,匹配子查詢的半連接和子查詢滿足以下的匹配條件:SQL語法分析樹中的半連接的語句和子查詢的語句均是第一類型語句或者第二類型語句、SQL語法分析樹中的半連接的標(biāo)識(shí)碼和子查詢的標(biāo)識(shí)碼相同以及與子查詢關(guān)聯(lián)的主查詢的第二謂詞表達(dá)式中所引用主查詢的列和SQL語法分析樹中的半連接的連接條件上引用的主查詢的列相同。
步驟208,判斷匹配子查詢的半連接的語句和子查詢的語句是否均是第一類型語句或者第二類型語句,若判定匹配子查詢的半連接的語句和子查詢的語句均是第一類型語句或者第二類型語句,則執(zhí)行步驟212,若判定匹配子查詢的半連接的語句和子查詢的語句并不均是第一類型語句或者第二類型語句,則執(zhí)行步驟210。
步驟210,將子查詢作為半連接加入到SQL語法分析樹中。
步驟212,判斷匹配子查詢的半連接的語句和子查詢的語句是否均是第二類型語句,若判定匹配子查詢的半連接的語句和子查詢的語句均是第二類型語句,則執(zhí)行步驟214,若判定匹配子查詢的半連接的語句和子查詢的語句均不是第二類型語句,說明匹配子查詢的半連接的語句和子查詢的語句均是第一類型語句,則執(zhí)行步驟218。
步驟214,將第二類型語句中的過濾條件作為第一謂詞表達(dá)式。
步驟216,判斷第二類型語句轉(zhuǎn)化成的半連接和匹配子查詢的半連接的類型是否相同,若判定第二類型語句轉(zhuǎn)化成的半連接和匹配子查詢的半連接的類型相同,則執(zhí)行步驟224,若判定第二類型語句轉(zhuǎn)化成的半連接和匹配子查詢的半連接的類型不相同,則執(zhí)行步驟222。
步驟218,將第一類型語句中的過濾條件作為第一謂詞表達(dá)式。
步驟220,判斷第一類型語句轉(zhuǎn)化成的半連接和匹配子查詢的半連接的類型是否相同,若判定第一類型語句轉(zhuǎn)化成的半連接和匹配子查詢的半連接的類型相同,則執(zhí)行步驟224,若判定第一類型語句轉(zhuǎn)化成的半連接和匹配子查詢的半連接的類型不相同,說明第一類型語句轉(zhuǎn)化成的半連接為反半連接,則執(zhí)行步驟222。
步驟222,對(duì)第一謂詞表達(dá)式取反,取反后的第一謂詞表達(dá)式的操作符是NOT。
步驟224,將第一謂詞表達(dá)式與匹配子查詢的半連接中的過濾條件合并。其中,若未對(duì)第一謂詞表達(dá)式取反,則直接使用第一謂詞表達(dá)式與匹配子查詢的半連接中的過濾條件合并;若對(duì)第一謂詞表達(dá)式取反,則使用取反后的第一謂詞表達(dá)式與匹配子查詢的半連接中的過濾條件合并。
另外,將第一謂詞表達(dá)式與匹配子查詢的半連接中的過濾條件合并得到的一個(gè)新的謂詞表達(dá)式,該謂詞表達(dá)式的操作符是AND。
圖3示出了根據(jù)本發(fā)明的一個(gè)實(shí)施例的半連接合并裝置的結(jié)構(gòu)示意圖。
如圖3所示,根據(jù)本發(fā)明的一個(gè)實(shí)施例的半連接合并裝置300,包括:查詢單元302、確定單元304、判斷單元306和合并單元308。
查詢單元302,用于在SQL語法分析樹中查詢匹配子查詢的半連接。
優(yōu)選地,所述查詢單元302包括:確定子單元3022,用于遍歷所述SQL語法分析樹,以確定所述SQL語法分析樹中的半連接和所述子查詢是否滿足匹配條件;所述確定子單元3022還用于,若所述SQL語法分析樹中的半連接和所述子查詢滿足所述匹配條件,則將所述SQL語法分析樹中的滿足所述匹配條件的半連接作為匹配所述子查詢的半連接;其中,所述匹配條件包括:所述SQL語法分析樹中的半連接的語句和所述子查詢的語句均是第一類型語句或者第二類型語句、所述SQL語法分析樹中的半連接的標(biāo)識(shí)碼和所述子查詢的標(biāo)識(shí)碼相同以及與所述子查詢關(guān)聯(lián)的主查詢的第二謂詞表達(dá)式中所引用所述主查詢的列和所述SQL語法分析樹中的半連接的連接條件上引用的所述主查詢的列相同。
通過遍歷SQL語法分析樹,以在SQL語法分析樹中更加全面、準(zhǔn)確地查詢出與子查詢滿足匹配條件的半連接。
優(yōu)選地,所述第一類型語句包括:IN語句和/或ANY語句;所述第二類型語句包括:EXIST語句。
確定單元304,用于若匹配所述子查詢的半連接的語句和所述子查詢的語句均是第一類型語句和第二類型語句的其中一種語句,則根據(jù)該種語句確定待合并的第一謂詞表達(dá)式。
優(yōu)選地,所述確定單元304具體用于,若匹配所述子查詢的半連接的語句和所述子查詢的語句均是所述第一類型語句,則將所述第一類型語句中的過濾條件作為所述第一謂詞表達(dá)式;若匹配所述子查詢的半連接的語句和所述子查詢的語句均是所述第二類型語句,則將所述第二類型語句中的過濾條件作為所述第一謂詞表達(dá)式。
判斷單元306,用于判斷該種語句轉(zhuǎn)化成的半連接和匹配所述子查詢的半連接的類型是否相同。
合并單元308,用于若所述判斷單元306判定該種語句轉(zhuǎn)化成的半連接和匹配所述子查詢的半連接的類型相同,則將所述第一謂詞表達(dá)式與匹配所述子查詢的半連接中的過濾條件進(jìn)行合并;以及所述合并單元308還用于,若所述判斷單元306判定該種語句轉(zhuǎn)化成的半連接和匹配所述子查詢的半連接的類型不相同,則對(duì)所述第一謂詞表達(dá)式進(jìn)行取反,并將取反后的第一謂詞表達(dá)式與匹配所述子查詢的半連接中的過濾條件進(jìn)行合并。
在該技術(shù)方案中,通過將第一謂詞表達(dá)式與匹配子查詢的半連接中的過濾條件進(jìn)行合并,由于謂詞表達(dá)式中的有半連接,因此,通過以上的合并可以將兩個(gè)半連接合并成一個(gè)半連接來獲得最優(yōu)的查詢計(jì)劃。通過以上方案,一方面減少了半連接的數(shù)量,從而減少了參與連接的表的數(shù)量,因此在查詢優(yōu)化階段搜索最優(yōu)的表的訪問路徑時(shí),會(huì)縮小搜索空間,進(jìn)而減小生成最優(yōu)訪問路徑的時(shí)間,最終能減少生成查詢計(jì)劃的時(shí)間。另一方面,可以得到一個(gè)更優(yōu)化的查詢計(jì)劃,合并之后的半連接中的謂詞表達(dá)式的選擇率更加小,并且半連接的數(shù)量也會(huì)減少,這樣在執(zhí)行查詢計(jì)劃階段,不但能減少對(duì)物理表的訪問和減少相應(yīng)的磁盤IO,而且還因?yàn)橹^詞表達(dá)式的合并,可以減少重復(fù)的謂詞表達(dá)式的計(jì)算,從而大大節(jié)約了CPU的開銷。
在上述技術(shù)方案中,優(yōu)選地,半連接合并裝置300還包括:獲取單元310,用于獲取所述子查詢的語法分析樹中的多個(gè)關(guān)鍵字段;生成單元312,用于根據(jù)所述多個(gè)關(guān)鍵字段,生成所述子查詢的標(biāo)識(shí)碼。
例如,生成單元312可以將子查詢的語法分析樹中的多個(gè)關(guān)鍵字段合并成一個(gè)總字段;使用無符號(hào)的整形數(shù)(例如,64位的整形數(shù))對(duì)總字段進(jìn)行編碼,以將總字段的編碼作為子查詢的標(biāo)識(shí)碼。
再例如,生成單元312也可以使用無符號(hào)的整形數(shù)(例如,64位的整形數(shù)),分別對(duì)子查詢的語法分析樹中的多個(gè)關(guān)鍵字段中的每個(gè)關(guān)鍵字段進(jìn)行編碼,再將多個(gè)關(guān)鍵字段的編碼進(jìn)行合并,以將合并得到的編碼作為子查詢的標(biāo)識(shí)碼。
通過子查詢的語法分析樹中的多個(gè)關(guān)鍵字段生成子查詢的標(biāo)識(shí)碼并存儲(chǔ)在該子查詢的語法分析樹中,從而根據(jù)該子查詢的標(biāo)識(shí)碼可以快速地在SQL語法分析樹中查詢出與子查詢滿足匹配條件的半連接。
在上述任一技術(shù)方案中,優(yōu)選地,半連接合并裝置300還包括:加入單元314,用于若所述查詢單元302在所述SQL語法分析樹中未查詢到匹配所述子查詢的半連接,則將所述子查詢作為半連接加入到所述SQL語法分析樹中;以及所述加入單元314還用于,若匹配所述子查詢的半連接的語句和所述子查詢的語句均不是所述第一類型語句或者所述第二類型語句,則將所述子查詢作為半連接加入到所述SQL語法分析樹中。
在未查詢到匹配子查詢的半連接,或者匹配子查詢的半連接的語句和子查詢的語句均不是第一類型語句或者第二類型語句時(shí),將子查詢作為半連接加入到SQL語法分析樹中,從而保證了半連接合并時(shí)的可靠性。
以上結(jié)合附圖詳細(xì)說明了本發(fā)明的技術(shù)方案,通過本發(fā)明的技術(shù)方案,通過對(duì)半連接進(jìn)行合并,以在查詢優(yōu)化階段縮小搜索空間和在執(zhí)行查詢計(jì)劃階段減少訪問物理表的次數(shù)和減少重復(fù)的謂詞表達(dá)式的計(jì)算。
在本發(fā)明中,術(shù)語“第一”、“第二”僅用于描述的目的,而不能理解為指示或暗示相對(duì)重要性;術(shù)語“多個(gè)”表示兩個(gè)或兩個(gè)以上。對(duì)于本領(lǐng)域的普通技術(shù)人員而言,可以根據(jù)具體情況理解上述術(shù)語在本發(fā)明中的具體含義。
以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。