專利名稱::自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng)的制作方法
技術領域:
:本發(fā)明涉及數(shù)據(jù)庫軟件系統(tǒng)的測試技術。更具體地說,本發(fā)明涉及自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng),通過考慮列組數(shù)據(jù)相關性(ColumnGroupDataCorrelation)和行集數(shù)約束(CardinalityConstraint),能夠基于謂詞^數(shù)實例化(instantiation)自動生成用于數(shù)據(jù)庫的查詢。
背景技術:
:自動地生成用于測試數(shù)據(jù)庫引擎的新功能(比如優(yōu)化器算法)的查詢以及用于評估數(shù)據(jù)庫應用(例如電子商務應用)的性能的查詢在實踐中是一項非常令人氣餒的工作。在許多測試情形中,需要非常仔細地的設計測試查詢,這往往使得測試工作十分辛苦并耗費大量時間。對在數(shù)據(jù)庫引擎中新設計和/或新開發(fā)的功能,比如新優(yōu)化器算法進行性能和質量的測試,B相對改進的常用方法是生成一組測試數(shù)據(jù)和查詢,然后比較施加新功能之前和之后數(shù)據(jù)庫系統(tǒng)的行為。顯然,對于給定的測試數(shù)據(jù)庫,合理的測試方案應當涵蓋具有寬范圍的模式和特征各種查詢。另外,針對特定測試目的/方案,非常希望能夠控制測試查詢的輸入(例如,參數(shù)值,謂詞過濾,以及選擇條件等等)和輸出(例如,中間查詢結果和行集數(shù)等等)。但是,對于業(yè)界和學術領域的當前裝備來說,獲取如上所述期望的測試查詢幾乎是不可能的,這是因為所生成的查詢是獨立于測試數(shù)據(jù)庫的。結果,在大多數(shù)情形下不得不忍受"嘗試-失敗"所帶來的不利后果。對于評估數(shù)據(jù)庫應用的性能和測試數(shù)據(jù)庫應用的魯棒性而言,由于諸多眾所周知的優(yōu)點,比如效率、靈活性和安全性,因此當今的應用大多使用具有^^lt才示i己(parametermarker)或主變量(hostvariable)的動態(tài)查詢。此類動態(tài)SQL的4吏用對基于成本的數(shù)據(jù)庫優(yōu)化器提出了巨大挑戰(zhàn),并且作為結果可能導致查詢潛在的性能退化,這是因為經(jīng)常確定無效的訪問路徑。由于在使用^t標記模糊化搜索條件的情況下,優(yōu)化器的估計僅僅簡單地基于默認值和改寫(interpolation)、猜測工作的種類,結果是不能區(qū)分有效和無效訪問路徑。因此,測試具有潛在輸入變化的查詢性能非常重要。,然而,對于所有的參數(shù)標記測試有意義的輸入值非常困難,這是因為在應用運行期間所有的^都是動態(tài)設置的。即使在運行應用時進行測試,不僅顯著增加測試工作的復雜性和繁瑣程度,而且也難以保證探究所有的主要可能情況(比如,最;^/最小值、數(shù)據(jù)偏斜、以及數(shù)據(jù)相關性等等)。因此,對于與數(shù)據(jù)庫管理系統(tǒng)(DBMS,databasemanagementsystem)相關的測試,非常需要能夠以自動并且可控的方式來生成期望的測試查詢。當前業(yè)界和學術領域已經(jīng)針對自動生成查詢進行了一些研究并提出了相應的自動生成查詢的方法。但是,在這些自動查詢生成解決方案中,大多數(shù)都不針對測試的目的。比如,在美國專利US6,285,998中提出了一種允許用戶針對數(shù)據(jù)庫查詢快速指定期望值并保存查詢以便再使用的查詢方法。雖然能夠方便地生成并且容易地再使用查詢,但是該方法并不能解決測試數(shù)據(jù)庫性能的問題。另外,在測試查詢生成領域,v^有關于測試數(shù)據(jù)庫和測試查詢之間的關系方面來看,存在兩種主要的方案。第一種方案不考慮lt據(jù)而生成查詢,此類解決方案不能處理上面所討論的兩種情形,即,對在lt據(jù)庫引擎中新設計和/或新開發(fā)的功能進行性能和質量的測試、以及評估數(shù)據(jù)庫應用的性能和測試數(shù)據(jù)庫應用的魯棒性,這是因為此類解決方案均i殳計為生成通用目的的查詢。例如,在J.Tuya,M.J.SMrez-Cabal和C.laRiva發(fā)表的"Mutatingdatabasequeries",/<9Mffl/7fi/o簡flftVw"wd5V/^nwerecA/io/ow,2007,Elsevier中將突變測試概念引入DBMS測試中,通iM"查詢生成一組突變因子來確保SQL測試的涵蓋范圍。但是,通過該方法生成的大多數(shù)查詢都與底層的測試數(shù)據(jù)不相關。作為另一個例子,在美國專利US6,138,U2、US6,581,052、US6,826,558和US7,007,007中提出了一種在短時間內隨機地生成大量有效SQL語句的方法。但是,該生成是以隨機的方式進行的,因此很難控制測試用例的輸入和輸出。第二種方案則通過考慮測試數(shù)據(jù)來生成查詢,但是目前提出的解決方案在實際應用中都存在諸多限制。例如,在N.Bruno,S.Chaudhuri和D.Thomas發(fā)表的"GeneratingQuerieswithCardinalityConstraintsforDBMSTesting",/EEE7hiwsfl"/柳sJDiow/^l^朋</五"g/"em."g,2006中提出了一種生成具有行集數(shù)約束的查詢的方法。但是,該工作卻基于查詢中的各個謂詞彼此相互獨立的假設,這在實際應用中是非常罕見的,因而也m^取得理想的結果。
發(fā)明內容鑒于上述情況,本發(fā)明針對與DBMS相關的測試提供一種自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng),其自動生成數(shù)據(jù)庫查詢的策略基于具有特定行集數(shù)約束的給定查詢中的每一個局部謂詞的M實例化。根據(jù)本發(fā)明的一個方面,提供一種生成數(shù)據(jù)庫查詢的方法,包括步驟接收輸入查詢和行集數(shù)約束;以及根據(jù)數(shù)據(jù)庫的列組數(shù)據(jù)相關性對輸入查詢的局部謂詞^lt進行實例化,以生成滿足行集數(shù)約束的候選測試查詢。優(yōu)選地,生成測試查詢的步驟包括步驟為輸入查詢構建有向查詢圖;對有向查詢圖進布逸歷以構建有向生成樹;對有向生成樹進行遍歷以生成中間結果表;以及根據(jù)中間結果表生成滿足行集數(shù)約束的候選測試查詢。根據(jù)本發(fā)明的另一個方面,提供一種生成數(shù)據(jù)庫查詢的系統(tǒng),包括有向查詢圖構建器,用于為輸入查詢構建有向查詢圖;有向生成樹構建器,用于對有向查詢圖進行遍歷以構建有向生成樹;矩陣生成器,用于對有向生成樹進行遍歷以生成中間結果表;以及候選查詢生成器,用于才艮據(jù)中間結a生成滿足行集數(shù)約束的候選測試查詢。優(yōu)選地,按照參照完整性關系為輸入查詢構建具有根頂點的有向查詢圖;通過深度優(yōu)先遍歷對有向查詢圖進行遍歷以構建有向生成樹;以及通過廣度優(yōu)先搜索對有向生成樹進行遍歷以生成中間結^。根據(jù)本發(fā)明的一個優(yōu)選實施例,生成中間結果表的步驟按照層次順序對有向生成樹進行遍歷,并且包括步驟針對每一層的有向生成樹遍歷,級聯(lián)輸入查詢中局部謂詞的參照列作為中間結果表的列組;通過對列組值進行分組從數(shù)據(jù)庫中檢索聚合數(shù)據(jù)信息;以及在中間結果表中保留各列組值均滿足行集數(shù)約束的列組值并在中間結果表中記錄行集數(shù)。根據(jù)本發(fā)明的另一個優(yōu)選實施例,行集數(shù)約束c為在可接受范圍內的行集數(shù)約束C',并且所述方法還包括根據(jù)"相對偏差-max(f^)"對所生成的候選測試查詢進行評價的步驟,以從中選擇一組期望的測試查詢。此夕卜,才艮據(jù)本發(fā)明的一個實施例,局部謂詞包括等于謂詞、單側謂詞、以及雙側謂詞。根據(jù)本發(fā)明的再一個優(yōu)選實施例,在為輸入查詢構建的有向查詢圖為多于一個根頂點的情況下,所述方法還包括步驟在構建有向查詢圖之后,標識有向查詢圖中的接合點和橋接?。辉跇嫿ㄓ邢蛏蓸渲?,通過虛擬弧鏈接不同有向生成樹中的相關頂點,以將構建有向生成樹步驟所構建的多個有向生成樹轉換成有向生成森林;以及在中間結果表生成步驟中分別針對每一個有向生成樹生成中間結果,然后將每一個中間結果表看作臨時表,將虛擬弧作為有向生成樹之間的聯(lián)接關系,以進一步生成最終的中間結果表。根據(jù)本發(fā)明的另一個優(yōu)選實施例,查詢包括子查詢,并且如果子查詢?yōu)橄嚓P子查詢,將其去相關為不相關子查詢;所述方法在生成候選測試查詢之前還包括步驟從最深層的子查詢開始直到最外層子查詢,逐層迭代生成中間結M。此外,根據(jù)本發(fā)明的一個實施例,行集數(shù)約束為多個行集數(shù)約束,分別用于有向生成樹的各層。根據(jù)本發(fā)明的另一個優(yōu)選實施例,在有向生成樹為左深樹的情況下,根據(jù)查詢訪問計劃的的^i接順序來逐層生成中間結果表。才艮據(jù)本發(fā)明的自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng),通過考慮目標測試數(shù)據(jù)庫中的數(shù)據(jù)使得所生成的查詢能夠滿足特定行集數(shù)約束,這使得用戶能夠將行集數(shù)約束指定為輸入,并由此能夠生成期望的測試查詢作為用于特定目的測試的輸出。根據(jù)本發(fā)明的自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng),利用通過(類似)外鍵聯(lián)接的表的數(shù)據(jù)依賴來構建有向查詢圖,并且進而生成有向生成森林或者有向生成樹。通iti4歷有向生成森林或者有向生成樹,根據(jù)本發(fā)明的自動生成數(shù)據(jù)庫的方法和系統(tǒng)能夠從目標測試數(shù)據(jù)庫中檢索鏈接的列組的聚合數(shù)據(jù)信息,從而使得所生成的數(shù)據(jù)庫查詢與目標測試數(shù)據(jù)庫的相關性得到加強。根據(jù)本發(fā)明的自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng),在檢索聚合數(shù)據(jù)信息時能夠正視列組的數(shù)據(jù)相關性。也就是說,將(一個表或者一組表)的局部謂詞的參照列鏈接為列組,并且通過按照列組值進行分組iM^目標測試數(shù)據(jù)庫中查找數(shù)據(jù)和檢索聚合數(shù)據(jù)信息。這樣,就避免了假設在實際應用中非常罕見的查詢的各個謂詞彼此相互獨立的情況。根據(jù)本發(fā)明的自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng),才艮據(jù)所檢索到的聚合數(shù)據(jù)信息通過對輸入查詢的局部謂詞的參數(shù)值進行實例化來自動生成最后的候選查詢,由此使得所得到的候選查詢與目標測試數(shù)據(jù)庫的相關性得到加強。因此,根據(jù)本發(fā)明的自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng),不僅能夠自動生成滿足特定行集數(shù)約束的查詢,而且還通過設置從目標測試數(shù)據(jù)庫中聚合的有意義的數(shù)據(jù)(值)來替代查詢中每一個局部謂詞的參數(shù)值,使得所得到的查詢與目標測試數(shù)據(jù)庫的相關性得到加強。另外,本發(fā)明還提供用于實現(xiàn)上述自動生成數(shù)據(jù)庫查詢的方法的計算^4呈序。此外,本發(fā)明也提供至少計算機可讀介質形式的計算機程序產(chǎn)品,其上記錄有用于實現(xiàn)上述自動生成數(shù)據(jù)庫查詢的方法的計算積4呈序代碼。參照下面結合附圖對本發(fā)明實施例的說明,會更加容易地理解本發(fā)明的以上和其它目的、特點和優(yōu)點。在附圖中,相同的或對應的技術特征或部件將采用相同或對應的附圖標記來表示。附圖中圖1示出根據(jù)本發(fā)明的自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng)的原理示意圖2(a)示出初始查詢g的SQL表示;圖2(b)示出考慮傳遞閉包的查詢0+的SQL表示;圖2(c)示出新生成的查詢g'的SQL表示;圖3示出根據(jù)本發(fā)明的自動生成數(shù)據(jù)庫查詢的方法的總體流程圖4(a)示出才艮據(jù)本發(fā)明的一個實施例的有向查詢圖Ge;圖4(b)示出對圖4(a)所示的有向查詢圖G。進行遍歷后生成的有向生成樹re;圖4(c)示出圖4(b)所示的有向生成樹re的等價分層樹結構re;圖5(a)示出具有多個根頂點的有向查詢圖5(b)示出對圖5(a)所示的有向查詢圖進行遍歷后生成的有向生成森林;10圖5(c)示出對圖5(b)的有向生成森林進行變換后得到的變換后的有向生成森林;圖6示出用虛擬頂點構成的有向生成樹;圖7示出具有三層子查詢的有向生成森林的結構;圖8示出通過左深樹進行的查詢訪問計劃;以及圖9示出根據(jù)本發(fā)明的自動生成數(shù)據(jù)庫查詢的系統(tǒng)的總體方框圖。具體實施例方式下面參照附圖來說明本發(fā)明的實施例。應當注意,為了清楚的目的,附圖和說明中省略了與本發(fā)明無關的、本領域普通技術人員已知的部件和處理的表示和描述。現(xiàn)在參考附圖,特別是圖l,首先描述本發(fā)明所要解決的具體技術問題。在此可以簡單地將本發(fā)明要解決的問題歸納為生成具有特定行集數(shù)約束的查詢。如圖l所示,根據(jù)本發(fā)明的自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng),將給定的測試數(shù)據(jù)庫D、查詢0、以及用戶規(guī)定的行集數(shù)約束C作為輸入,通過找到使得查詢滿足約束C的參數(shù)值由自動查詢生成模塊按照謂詞M實例化原則生成一組候選查詢^作為輸出。所新生成的該組候選查詢可以表示為W|每一個0'均滿足約束C]。對于一個查詢0,其簡單的SQL語句表述如圖2(a)所示(在此為了筒潔省略了GROUPBY、ORDERBY等子句),示出初始查詢的SQL表示,其中s^4或者聚合列的集合,Ti,..,r"是查詢g的參照表的列表,r/丄(is"")是表77的局部謂詞集合并且可以表示為析取范式77丄C,產(chǎn)/^A…A77丄C汰-;7汰,每一個丄CV^部謂詞T7丄C『/^的參照列并且/^是相關^lt(i^"w,1^/、a),/是聯(lián)接謂詞集合。這里使用r/丄c表示表7的局部謂詞中的所有參照列的集合,使用Ti/(:表示表ri'的聯(lián)接謂詞中的所有參照列的集合,并且使用7L/表示所有表r/的聯(lián)接謂詞的集合。因此,^^riju…ur"j。在某些情況下,查詢中謂詞的參數(shù)/^可能不是具體的值,而是^lt標記或者主變量,例如局部謂詞27丄C『/^可以是T7丄q^或者T7丄C『:hvl。為了保留聯(lián)接關系并JLit免在處理過程中遺漏可能的聯(lián)接,需要通過增加邏輯上隱含的聯(lián)接來針對初始查詢0找到其傳遞閉包查詢^+。圖2(b)是考慮聯(lián)接的傳遞所得到的傳遞閉包查詢g+的的SQL語句表示,其中聯(lián)接謂詞集合/+是聯(lián)接謂詞集合/的傳遞閉包?,F(xiàn)在可以將本發(fā)明的查詢生成策略具體描述為,對于圖2(a)和圖2(b)分別表示的給定查詢0和其傳遞閉包0+,自動生成一組滿足約束C的測試查詢,新生成的每一個查詢g'的格式類似于圖2(c)所示的格式。更具體地說,通過修改每一個表的局部謂詞的M值來生成查詢。因此,對于查詢0的每一個表7Y及其初始局部謂詞T7丄,新查詢^沖的新的局部謂詞集合T7丄'被^lt化為7LLC,尸/7,/a...aT7丄G;T/,汰',其中每一個>1*值/V(1^/、"由下面將詳細描述的本發(fā)明的自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng)來賦值。在此將該處理過程稱為謂詞^lt實例化。在針對每一個局部謂詞進行參數(shù)實例化的過程中,與上面提到的N.Bruno,S.Chaudhuri和D.Thomas在"GeneratingQuerieswithCardinalityConstraintsforDBMSTesting",71rflwsfldVws柳A/iow/^^"iM/2)"to五"g/"MW"g,2006中假設實際應用中非常罕見的查詢中的各個謂詞彼此相互獨立不同,在本發(fā)明的查詢生成過程中考慮列的相關性。為了便于更加清楚地理解本發(fā)明的實質和原理,在下面的描述中將會結合一個具體應用實例來進行i兌明。該實例為IBMWebSphereCommerce環(huán)境下的一個四路聯(lián)接查詢0,如下所示SELECTATTRVALUE.SEQUENCE,ATTRIBUTE.USAGE,ATTRIBUTE.DESCRIPTION,ATTRTYPE.OID,CATENTRY.PARTNUMBER,CATENTRY.URL,CATENTRY.CATENTRY—ID,CATENTRY.ONAUCTIOS",CATENTRY.LASTUPDATE,CATENTRY.MARKFORDELETE,CATENTRY.STARTDATE,CATENTRY.ENDDATEFROMATTRVALUE,ATTRIBUTE,ATTRTYPE,CATENTRYWHEREATTRVALUE.STRINGVALUE=ANDATTRVALUE.NAME=ANDATTRIBUTE.GTYUNIT—ID=ANDATTRTYPE.DESCRIPTION=ANDCATENTRY.F工ELD4=ANDATTRVALUE.ATTRIBUTE—工D=ATTRIBUTE.AT"FRIBUTE—IDANDATTRVALUE.ATTRTYPE—ID=—ATTRTYPE.ATfRTYPE一IDANDATTRVALUE.CATENTRY一ID=一CATENTRY.CATENTRY—IDANDATTRIBUTE.CATENTRY—ID=—CATENTRY.CATENTRY—ID;為了使問題更加清楚簡潔并突出本發(fā)明的^[心原理,利用下表1所示的符號解釋映射將上述查詢g進行符號化表示。表1符號解釋映射表符號查詢元素TlATTRVALUET2ATTRIBUTET3ATTRTYPET4CATENTRYTl.ClATTRVALUE.STRINGVALUET1.C8ATTRVALUE.NAMET2.C5ATTRIBUTE.GTYUNITIDT3.C6ATTRIBUTE.GTYUNITIDT4.C7CATENTRY.FIELD4T1.C2ATTRVALUE.ATTRIBUTEIDT1.C3ATTRVALUE.ATTRTYPEIDTl.C4ATTRVALUE.CATENTRY工DT2.C2ATTRIBUTE.ATTRIBUTEIDT2.C4ATTRIBUTE.CATENTRY工DT3.C3ATTRTYPE.ATTRTYPEIDT4.C4CATENTRY.CATENTRYIDSATTRVALUE.SE叫ENCE,ATTRIBUTE.USAGE,ATTRIBUTE.DESCRIPTION,ATTRTYPE.〇ID,CATENTRY.PARTNUMBER,CATENTRY.URL,CATENTRY.CATENTRYID,CATENTRY.ONAUCT工O百,CATENTRY.LASTUPDATE,CATENTRY.MARKFORDELETE,CATENTRY.STARTDATE,CATENTRY.ENDDATE按照上表1的符號解釋,對上述查詢G進行符號化后的SQL語句表示如下f斤示SELECTSFROMTl,T2,T3,T4WHERETl.Cl=ANDT1.C8=ANDT2.C5=AND13T3.C6=ANDT4.C7=ANDT1.C2=T2.C2ANDT1.C3=T3.C3ANDT1.C4=T4.C4ANDT2.C4=T4.C4相應地,其傳遞閉包查詢g+的SQL語句表示如下所示SELECTSFROMTl,T2,T3,T4WHERET1.C1=ANDT1.C8=ANDT2.C5=ANDT3.C6=ANDT4.C7=ANDT1.C2=T2.C2ANDT1.C4=T2.C4AND十<—傳遞T1.C3=T3.C3ANDT1.C4=T4.C4ANDT2.C4=T4.C4這里,用符號十表示通過傳遞閉包增加的聯(lián)接謂詞。至此,經(jīng)過上述筒化處理之后,問題變?yōu)獒槍Σ樵?如何生成一組滿足用戶規(guī)定的行集數(shù)約束c的新查詢g',即將上述查詢中謂詞參數(shù)"?"進行實例化處理后生成候選查詢0'。下面將結合附圖并針對上述實例詳細說明本發(fā)明的自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng)。參考圖3,示出才艮據(jù)4^發(fā)明的自動生成數(shù)據(jù)庫查詢的方法的總體流程圖。如圖3所示,首先在步驟S31中,通過考慮(類似)參照完整性關系為給定查詢0生成有向查詢圖Ge。對于查詢g,假定<72=<^,j一是其頂點標注的有向圖,其中Kg是頂點集合,每一個頂點代表查詢0所參照的一個表"e是弧集合^r",7V>ir",rveKeAr"#rv},每一個弧代表基于參照完整性的頂點r"和?v之間的聯(lián)接關系。第一個坐標r"表示子表或者細目表,而第二個坐標rv表示父表或者主表。在此假定在父和子屬性之間總是存在聯(lián)接關系以反映參照完整性關系?;〉姆较騽t暗示了子屬性和父屬性之間的依賴關系。也就是說,父屬性決定了其子屬性,并且由此子屬性的每一個值總是能夠唯一地在父表中找到。在某些情況下,各個表通過類似外鍵聯(lián)接,例如一對一聯(lián)接。作為另一個例子,表的屬性的值為另一個表的聯(lián)接屬性的值的子集或超集(superset)。所有這些聯(lián)接都可以在通過本發(fā)明的有向查詢圖來表示。通常,有向圖Ge中的頂點r"通過(A:+i+w)元組(/q,…,/Q,yc。,yd,…,y^)來標注,其中元素yc。表示r"的聯(lián)接父屬性(列),每一個元素(12/^附)表示聯(lián)接子屬性(列)中的一個,以及每一個元素/c,(ls/d)表示r"的局部謂詞的一個中的列。在此,通過將父屬性加星號(*)以及將局部謂詞的列加下劃線CJ而將上述(A:+l+w)元組(/d,…,/Q,大。,yd,表示為(Za,.."hJc。、yd,...,_/、),以便在查詢圖中清楚地區(qū)分這三種表中的列。圖4(a)示出了按照上述規(guī)則對上面給出的實例所構造的有向查詢圖。如圖4(a)中所示,T1.C1和T1.C8、T2.C5、T3.C6、T4.C7分別是表T1、T2、T3、T4的局部謂詞的列,因此在其下邊加上下劃線。T2.C2、T3.C3、T4.C4則是聯(lián)接父屬性(列),因此加上星號(*)以示區(qū)別。余下的T1.C2、T1.C3、T1.C4、T2.C4則是聯(lián)接子屬性(列)。應該指出的是,在有向查詢圖Ge中,如果一個頂點7>的入度/《7>)為O,則將該頂點2>稱為圖Ge的才艮頂點。對于才艮頂點2>,其標注的元組總是fe,…,Ze^M,…,六J,表明表7>沒有被參照的父屬性,因此不會有大o。在上面所示的實例中,Tl^l才艮頂點。另外,對于一個頂點r/,如果其出度orf(r/)為o,則其標注的元組總是fe,...,^,^。*),這表明表r/沒有子屬性,因此缺少/'d,…,和_/、。在上面所示的實例中,T3和T4是這一類型的頂點。在步驟S31中構建了有向查詢圖G^之后,處理流程前進到步驟S32,在此通過遍歷查詢圖Ge構建有向生成樹re。在該步驟S32中,根據(jù)本發(fā)明的一個實施例,通過深度優(yōu)先遍歷(DFS,DepthFirstSearch)來遍歷在步驟S31中生成的有向查詢圖Ge,以便生成有根的有向生成樹re。根據(jù)本發(fā)明的一個實施例,用于遍歷有向查詢圖(^的深度優(yōu)先遍歷的算法如下所示深血義遂>^#法餘入l命查詢^Ge7Vdfs(Ge,7V){visit(7V);addTVtotreeJ";頁foreachsuccessorJivofTVdoifisunvisited{dfs(Ge,rw);addarc<7V,JW>totreer;returnT7;根據(jù)本發(fā)明的一個實施例,用于生成有向生成樹&的算法如下所示#入.'^"力查詢窗Ge及詳推現(xiàn)《i;才橫種才^^成#reconstructSpanningTree(Gg,7"J{treeTg=dfsT》;returnJ^;按照上面所述的深度優(yōu)先遍歷算法7和構建有向生成樹算法c^m對m"5^mmVig7^^7對圖4(a)所示的有向查詢圖Gg進行遍歷后生成的有向生成樹T^如圖4(b)所示。圖4(c)為圖4(b)的等價表示,對圖4(b)所示的有向生成樹rg進行了調整,以便形成常用的分層樹結構。在步驟S32中通逸逸歷查詢圖Gg構建了有向生成樹;之后,處理流程前進到步驟S33,在此通過廣度優(yōu)先搜索(BFS,BreadthFirstSearch)遍歷有向生成樹7^,以便迭代生成中間結果M。上面所提到的謂詞^lt實例化也主要在這一步驟中完成。針對每一層樹遍歷構建臨時表AT,以便級聯(lián)查詢中局部謂詞(才艮據(jù)樹的層次順序可能為一個表的局部謂詞,也可能為一組表的局部謂詞)的參照列作為臨時表3f的列組,然后構勤目關的SQL語句,以便從目標測試數(shù)據(jù)庫中查找數(shù)據(jù)并且通過對列組值進行分組來檢索聚合數(shù)據(jù)信息。下面首先針對單個表來討論如何構建上述中間臨時表AT,然后將其擴展到一般情況下的多個表。首先,考慮查詢g中的表r,具有*個局部謂詞r丄c產(chǎn)Aa...r丄c^A的情況,其中r丄c,是表r的列并且/7,為相應的^,u,、A:?,F(xiàn)在模擬/ix(A+l)矩陣表M,如表2所示,其中/1是滿足指定行集數(shù)約束c的組(r丄d,…,r丄C;t)的相異值的數(shù)量。這里,將特征值M[vM,…,VM,card;J(1^/^")定義為列組(r丄d,...,r丄G)的一個數(shù)據(jù)組,并且這意味著在選擇第/i元組中的值來生成測試查詢時,每一個外將被實例化為vA,(h/《A:)。因此,表r的局部謂詞被精確地#*化為r丄c尸VMA…Ar丄C/pvM。值car&是列組的(r丄d,...,r丄G)數(shù)據(jù)組中的第a個最大的行集數(shù)??紤]用戶所指定的行集數(shù)約束c(這里為了簡潔起見先考慮單個行集數(shù)約束c的情況,對于多個行集數(shù)約束的情況將在下文中詳細描述),僅在中間表M中保留滿足條件card^c(ly^)的元組,而將表r的其他元組丟棄。<table>tableseeoriginaldocumentpage17</column></row><table>上述針對表T的矩陣Af可以通過下面的SQL語句ijb險索所有符合要求的記錄并構建SELECTAf.iC,M.CARDFROM(SELECTr.IC,COUNTS)ASCARDFROMrWHERE1=1GROUPBYT.LCHAVINGCOUNT(*)>=cORDERBYCARDDESC)ASM這樣,可以將所構建的矩陣M看作臨時表,其中wx(A+l)矩陣3/是一個具有(A:+l)自由度并且M的行集數(shù)為w的表。在此,用Af丄C表示AT的局部謂詞中的列集合(在單個表的情況下,7V/丄C等于r丄C),用M丄表示M的局部謂詞的集合,用M/C表示M的聯(lián)接謂詞的列集合。對于單個表的情況,M/C等于等于傳遞閉包聯(lián)接謂詞集合r./c+。實際上,并不將聯(lián)接的列構建到中間結果AT中,在這里定義列集合M/C僅僅用于M所有聯(lián)接的列的信息。下面將把上面針對單個表的情況推廣到更為一般的情形。現(xiàn)在考慮將Alx("l)矩陣作為現(xiàn)有的中間結果表以及另外還有一組表比如三個表ra、rp、和t;的情況。對于每一個元組MiVAi,.,VM,car(y(h/^w),構建下面的查詢,其中每一個局部謂詞T^丄C尸/;,的^故/7,.已經(jīng)用值vw進行了實例化。SELECTiVMC,見CARDFROM(selectm"ic,nc,rp.ic,rY.ic,COUNT("ASCARDfrom應,ra,rp,rYWHERE1=1AND&.id=vuANDM工.JLC^ANDgroupbyM;l.:lc^rp-ic,r"cHAVINGCOUNT(*)>=cORDERBYCARDDESC//第一i蘊UNIONUNIONselectm丄.icvra.icvrp.i:c,:rv.i:c,COUNT(*)ASCARDFROMM工,ra,Tp,r7WHERE1=1ANDM"IA"wANDm丄.jgroupbym工.工c,ra._lc,rp.i<c,HAVINGCOUNT(*)>=cORDERBYCARDDESC//第h^蘊unionUNIONselecti^.工c,ra.ic,rp.ic,rY.i/c,COUNT(*)ASCARDfrom逃,ra,Tp,rYWHERE1=1AND逃.vnlANDMljGROUPBYHC,HCVrp.iC,rY.i<cHAVINGCOUNT(*)>=cORDERBYCARDDESC//第13i蘊18根據(jù)該構造的查詢所得到的結果將形成(A:+i7;.丄ci+i7v丄q+i7v丄ci+i)維矩陣,該矩陣的行集數(shù)將由上述查詢的合格的行的數(shù)量確定。M的局部謂詞的列集合為AfL丄Cura丄Curp丄Cu7vzc,局部謂詞集合Af丄為A^丄u7;丄uuT^L,而聯(lián)接謂詞的列集合為Ml/Cura./c+urp./Ourr/c+0根據(jù)本發(fā)明的一個實施例,將上述操作歸結為生成中間結果矩陣的方法,稱作genMatrix()。該方法具有三個輸入^^t,中間結果表A^、一組表{71,...,7>1}、以及用戶指定的行集數(shù)約束c,而該方法將返回新的中間結果M。^作為輸出。實際上,該方法將才艮據(jù)輸入M構建查詢,以便從數(shù)據(jù)庫中檢索相關列組的聚合數(shù)據(jù)信息。對于單個表格r,更具體地說,該方法將實施為調用genMatrix(必,r,c),以4更檢索其中間結果。總上所述可以看出,在這一步驟S33中,將有向查詢圖的有向生成樹作為輸入,按照層次順序(BFS)來遍歷該有向生成樹,并且在每一層的處理期間迭代調用genMatrix(),以便生成中間結果表3f。還應該指出的是,可以允許行集數(shù)約束為一定的可接受的范圍,而不一定必須如上面所描述的為一個精確的數(shù)目。在行集數(shù)約束c和指定的絕對偏差dW』)的情況下,允許最終的行集數(shù)c'的大小可以在[c-《c+《(c-fl^c、c+力的范圍內。這樣,在最后一次調用genMatrix()時,在相應構建的查詢中的HAVING子句將被修改為HAVINGCOUNT(*)BETWEEN(cwOAND(c+力。當然,用戶也可以自己指定合格的行集數(shù)c'為[c,c+rf]下面將結合上文中給出的具體實例更進一步地詳細說明步驟S33中的處理.這里將圖4(c)的有向生成樹作為輸入,并且假定行集數(shù)約束c為1000,偏差d為100,并且希望最后得到的行集數(shù)范圍為[1000,1100。在該基礎上,將按照以下各層次的遍歷通過調用genMatrix()來生成滿足行集數(shù)約束的最終中間結果3/。第一層次遍歷,通過調用genMatrix(砂,71,1000)生成如下表3所示的中間結果Mi。表3M(T1)<table>tableseeoriginaldocumentpage19</column></row><table>GreenMajor56229BlueMajor23998VioletMinor9328WhiteMajor1816YellowMajor1386第一層次遍歷相關的SQL語句可以如下構建SELECTM丄.iC,M.CARDFROM(SELECTri.Cl,rl.C8,COUNT("ASCARDFROMriWHERE1=1GROUPBYTl.Cl,T1.C8HAVINGCOUNT(">=1000ORDERBYCARDDESC)ASM丄,.第二層次遍歷,通過調用genMatrix(Af^71,T3》,1000)生成如下表4所示的中間結果M2。表4恥(Tl,T2,T3)T1.C1T1.C8T2.C5T3.C6CARDBrownMinor2020Alabama2056BrownMinor2020Maine1560BrownMinor2020Arizona1260BlackMajor1098NewYork2105BlackMajor4648Utah1325BlackMajor1098California1309RedMajor4648California1207GreenMajor1354NewJersey1022第二層次遍歷相關的SQL語句可以如下構建(為了筒潔起見僅僅示出了部分SQL語句)SELECTU:C,M2.CARDFROM(SELECTn.ci,rl.C8,r2.C5,r3.C6,COUNT。)ASCARDFROMri,r2,r3WHERE1=1ANDn.Cl=、Brown'ANDn.C8="Minor'AND:ri.C2=T2.C2ANDri.C4=72.C4ANDri.C3=73.C3GROUPBYri.Cl,.C8,r2.C5,T3.C6HAVINGCOUNT(*)>=1000ORDERBYCARDDESCUNIONUNIONSELECTTl.Cl,ri.C8,12.C5,T3.COUNT(*)ASCARDfromri,r2,WHERE1=1ANDri.ci=Tl.C8=ri.C2=ri.c4=ri.C3=r3、Yellow'AND、Major'ANDr2.C2ANDr2.C4AND十T3.C3groupbyri.c:uri.c8,r2.cs,r3.c6HAVINGCOUNT(*)>=1000ORDERBYCARDDESC)ASM2,.第三層次遍歷,通過調用genMatrix(M2,r4,[1000,1100)生成如下表5所示的中間結果A/3。表5Af3(Tl,T2,T3,T4,最終結果)T1.C1T1.C8T2.C5T3.C6T4.C7CARDBrownMinor2020AlabamaDK1056BrownMinor2020MaineMV1030BrownMinor2020AlabamaKM1000BlackMajor1098CaliforniaWW1100BlackMajor1098NewYorkWD1100BlackMajor1098NewYorkDH1005第三層次遍歷相關的SQL語句可以如下構建(為了簡潔起見僅僅示出了部分SQL語句)SELECTM3.iC,M3.CARDFROM(SELECTrici,ri.C8,r2.C5,r3.T4.C7,COUNTdASCARDFROMri,r2,WHERE1=1ANDri.CI=、Brown'ANDri.C8=、Minor'ANDr2.C5=2020ANDr3.C6="Alabama'ANDr2.C4=r4.C4GROUPBYri.Cl^ri.C8,r2.C5,T3.C6,T4.C7HAVINGCOUNT(*)BETWEEN1000AND1100ORDERBYCARDDESCunionUNIONSELECTTl.Cl,rl.C8,r2.C5,r3.C6,r4.C7,COUNT(*)ASCARDFROMri,r2,T3,T4WHERE1=1ANDri.ci=ri.c8=r2.C5=r3.C6=ANDAND、Major'1354AND、NewJersey'AND21GROUPBYri.Cl,rl.C8,T2.C5,T3.C6,r4.C7HAVINGCOUNT("BETWEEN1000AND1100ORDERBYCARDDESC)ASAf3;現(xiàn)在回到圖3,在步驟S33中生成中間結果Af之后,處理流程前進到步驟S34,判斷是否遍歷了所有的頂點。如果沒有遍歷所有頂點,則返回步驟S33,繼續(xù)遍歷有向生成樹re,直到遍歷完所有的頂點。如果在步驟S34中判斷遍歷了所有的頂點,并且生成了滿足最終行集數(shù)約束c'的最終中間結果M,則處理流程前進到步驟S35,根據(jù)最終中間結果M生成候選測試查詢6'。這樣,對于w路聯(lián)接查詢g和行集數(shù)約束c,能夠檢索使得0滿足^的列組(71丄(:,...,7>1丄0的所有合格元組。相應地,根據(jù)最終中間結果M通過實例化每一個參數(shù)值即能夠自動地生成候選測試查詢g'。另外,在此定義相對偏差作為測試用例的評價因子,其中相對偏差=maXC)(如果f或C'為0,則任意地將其用l替代)。用戶能夠才艮據(jù)相對偏差方便地從所生成的候選測試用例中選擇一組子集合查詢作為所期望的最后結果。對于上文中提到的具體實例,在這一步驟S35中才艮據(jù)表5所示的最終中間結杲A/3可以得到如下表6所示的候選測試查詢0。表6候選測試查詢<table>tableseeoriginaldocumentpage22</column></row><table><table>tableseeoriginaldocumentpage23</column></row><table><table>tableseeoriginaldocumentpage24</column></row><table>COUNTdASCARDFROMrWHERE1=1GROUPBYr.id,ORDERBYn卜2,r.icwasc,r._LCJcDESC,CARDASC對于該SQL語句的結果,可以將其看作臨時的wx("l)矩陣ATr??紤]矩陣Mr中的如下p(A:+l)矩形區(qū)域對于矩陣Mr中的每一個值w,》和wy>(1^9,1^/^F,1s/^A:-2)總有附,對于矩陣Mr中的每一個值附,^i)和附wi)(1"^/、力總有附映d^附/(w),以及對于矩陣jfr中的每一個值附汰和附,(1^,'^/、力,如果附砂-1)=柳y(A-i)則總有附汰2附#。下面的表7示出了一個這樣的矩形區(qū)域,例如,r丄d的所有值等于fl,r丄G的所有值等于6,r丄cv-2的所有值等于z,r丄c^的所有值具有單調特性,當s/^y時"^,以及在^尸的條件下r丄cv的所有值具有單調特性,當《、W時v^v,y。表7矩形區(qū)域及#1#2#&-2欲r丄C2r丄GCARDWW1card"Icard^針對該矩形區(qū)域及r,通過使用函數(shù)subsume(cards,)=X<>card將第(A+1)列(列CARD)的值計算為5^x1矢量^subsu—cardw)subsum(cardw-J,然后用該矢量爿替換矩陣區(qū)域Wr的第(A+l)列的原始值,如下面的表8所示,表8替換后的矩形區(qū)域i^#1r丄d#26吣l'r丄G1i#(&+i)CARDsubsum(ca喊subsum(card斗tsubsum(cardj在該修正后的矩形區(qū)域中,丟棄了subsum(cardj<c的元組以便形成新的矩形區(qū)域A。因此,可以推斷當將局部謂詞實例化為A的第s/行A:元組i^[fl,6,…,;Mw,Vs,]時,subsum(cardj的值能夠更準確地等于最終的行集數(shù)約束c'。針對初始查詢^所生成的相關候選查詢g'如下所示,其實際的約束c'大于行集數(shù)約束c(0'滿足c)。SELECTSFROMrWHEREr.IAr,ic2=aAND=jbANDr.iC大-2=zANDT.I;Ch2usiANDr.工C;c2vsi;在整個矩陣Mr中,genMatrix()方法將查找所有這種類型的矩形區(qū)域,針對每一個這樣的區(qū)域分別調用subsum()函數(shù),并且丟棄不合格的元組,最后聯(lián)合所有剩余的元組以生成新的矩陣A^作為最終結果。對于其他的雙側范圍謂詞和多個表查詢的情況,也可以根據(jù)類似的原理修改genMatrix()來生成最終的中間結果矩陣。另夕卜,在某些情況下,在步驟S31中生成的有向查詢圖中可能存在多于一個的根頂點。圖5(a)示出違背一個根頂點期望的IO路聯(lián)接有向查詢圖。當使用多個根對有向查詢圖進行遍歷時,將構建有向生成森林,其包括一組斷開的有根的有向生成樹來替代單個有向生成樹。有向生成森林中的有向生成樹的數(shù)量通常由有向查詢圖中的根頂點的數(shù)量來決定。例如,對于圖5(a)所示的有向查詢圖,在構建的有向生成森林中存在兩個有向生成樹,如圖5(b)所示。從該示例中可以看出,在針對多個根頂點的有向查詢圖生成有向生成森林后,可能會丟失某些潛在的聯(lián)接關系。因此,針對這種情況,必須對圖3所示的方法進行改進以涵蓋這種情況。首先,在步驟S31之后增加子步驟S31+,以便標識有向查詢圖中的M點和橋接弧。通常情況下,接合點(也稱作切割頂點)和橋接邊是無向圖中的概念,用來表示圖的連通特征。在本發(fā)明的實施例中,將這些概念借用到有向圖中來說明本發(fā)明。在有向查詢圖中Ge,考慮三個頂點r"、7V和IV,如果存在兩個弧<71/,7^>和<7>,rw>,并且TV的入度iV/(7V)^2,但是從r"到TV或者從7v到r"沒有路徑,則將頂點TV定義為掩^點,并且將TV添加到接合點集合7Vg;Ke。同時,在此將弧〈r",7^>和<7>,7^>稱作橋接弧并將他們添加到橋接弧集合丑e={<I7,0>I77eKea"e7Vear!V7/}。在圖5(a)所示的示例中,#2={12}并且52={<T0,T2>,<T1,T2>,<T6,T2>,<T3,T2>}。然后在步驟S32中,通過有向查詢圖Gg中的每一個才艮頂點遍歷有向查詢圖Ge來構建有向生成森林Fg。在此筒要描述根據(jù)本發(fā)明一個實施例的構建有向生成樹的方法。針對圖5(a)所示的有向查詢圖,在構建了如圖5(b)所示的有向生成森林/^之后,TO和T2在一棵有向生成樹上,而Tl、T3和T6在另一棵有向生成樹上,在所生成的有向生成森林中這兩,相互斷開。因此,在步驟S32的構建有向生成森林的過程中丟失了他們的聯(lián)接關系。為了準確地保留這些聯(lián)接關系,需要增加子步驟S32+,以便通過連接不同有向生成樹中的相關頂點來將在步驟S32中構建的有向生成森林轉換成新的有向生成森林。在此通過一類特殊的弧,即"虛擬弧"來鏈接所有的這些聯(lián)接關系,在有向生成森林中用虛線弧表示。如圖5(c)所示,在該示例中,經(jīng)過有向生成森林變換之后的虛擬弧為用虛線表示的弧{<11,T2>,<T6,T2>,<T3,T2>}。進行有向生成森林變換的算法如下所示。"絲賴"顛#法"翁入;才/^查詢^^0及詳旅現(xiàn)威桌合及0餘A:逸括一個4^個^"橫^T命i成浙reFeconstructSpanningForest(Gg,尺g){forest&=0;foreachrootvertexreigdotree二dfs(Gg,r);returni7^;"義財^4'顛#法"^f/^i成溁淋i^及脊凝^C漠合5e翁/^.'^換^好|^^^^#尸2,及新辨脊凝級桌合5g,tramformSpanningForest(Fg,{foreacharce5。doifarc</,_/>existsinanyofspanningtree7^=52-〃removearc</,_/>from5^ifvertex/gspanningtree7^andvertexespanningtree(/八J1^#Tgs)i72=U</,/>;〃addvirtualarctoF2return(Fg,B。);最后,在步驟S33中分別針對每一個有向生成樹生成中間結果,然后可以將每一個中間結果看作臨時表,而虛擬弧則表示有向生成樹之間的聯(lián)接關系。這樣,將每一個中間結果作為一個虛擬頂點,如圖6所示,然后迭代調用genMatrix()直到遍歷了有向生成樹中的所有虛擬頂點為止。此夕卜,還應該指出的是,在前面的實施例中是以沒有子查詢的查詢?yōu)槔齣t行說明的。但是,本發(fā)明不僅限于此,而是也可以應用到具有子查詢的查詢中。雖然對于大多數(shù)具有子查詢的情況只關注其某一類特定的子查詢而不是整個查詢,由此可以應用上面所述的方法針對該類特定的子查詢構建滿足行集數(shù)約束的候選查詢,但是,本發(fā)明也可以針對一般的查詢級別而不是特定的子查詢來構建滿足行集數(shù)約束的候選查詢。對于包含不相關子查詢的查詢,可以從最深層的子查詢開始,構建該子查詢的有向查詢圖、構建其有向生成樹、以及調用genMatrix(),以便針對該子查詢生成中間結果。然后,將該中間結果作為虛擬頂點,并通過在有向生成森林中添加虛擬弧來處理其上一層子查詢。這樣,可以從最深層的子查詢開始迭^f戈處理所有層次的子查詢。圖7示出了處理多層次子查詢的一個示例。對于包^^目關子查詢的查詢,可以首先將這些相關的子查詢去相關,將他們變?yōu)椴幌嚓P的子查詢,然后再應用本發(fā)明的上述方法即可。關于相關子查詢的去相關方法,請參見美國專利US5,548,755、PraveenSeshadri,HamidPirahesh,T.Y.CliffLeung的"ComplexQueryDecorrelation",IniVocm/,Vf^s6>/J加/"fmi她Vmfl/CVw^^Mce<m五"giViemVig(ICDE1996),1996、以及P.Seshadri,J.M.Hellerstein,H.Pirahesh,T.Y.CliffLeung,R.Ramakrishnan,D.Srivastava,P.J.Stuckey,S.Sudarshan的"Cost-basedoptimizationformagic:algebraandimplementation",In^CM57GAfOi)及ecwY/,1996等有關文獻,在此略去其詳細說明。另外還應該指出的是,可以將上文中描述的單個行集數(shù)約束c擴展到多個行集數(shù)約束,這里用行集數(shù)集合C表示。考慮具有/層的有向生成樹re,可以制定多個行集數(shù)約束CMd,…,d每一個行集數(shù)約束c,.(h"/)用于在樹遍歷期間控制第/次調用genMatrix()時的中間結果的大小。例如,對于圖4(c)中的有向生成樹,在遍歷期間可以將行集數(shù)約束規(guī)定為0{cei,ce2,ce3}。更具體地,可以將單個行集數(shù)約束看作多個行集數(shù)約束的特例,只不過每一個行集數(shù)約束c,彼此均相等而已。相應地,對于具有r個有向生成樹、每一個樹7^(ls"。具有W層的有向生成森林/^,則可以指定行集數(shù)約束C》{c11,.."c1,,.",q1,.."Q,"..,cv1,""cv,,c1"..,Cm}。例如,對于圖5(b)所示的示例,可以指定行集數(shù)約束集合為0{^,Q2,Q3,C51,Cs2,C幼C54,Ci}o以這種方式,可以提供靈活的方式通過指定多個行集數(shù)約束來控制每一個中間結果的大小。此外,還應該注意的是,查詢訪問計劃通常都圖形化為左深樹,如圖8所示。在這種情況下,才艮據(jù)本發(fā)明的一個實施例,調用genMatrix()的順序則是根據(jù)訪問計劃的聯(lián)接順序來進行,而不;l按照上面所述的層次順序來進行遍歷。以圖8所示的實例為例,其:^接順序為77->r2->D,在此指定行集數(shù)約束CHd,C2,C3,C4,C^來控制每一個中間結果的大小。按照訪問計劃的^t接順序,對于圖8所示的左深樹,genMatrix()首先構建下述SQL語句,以便針對表77生成如表9所示的滿足行集數(shù)約束d的中間矩陣M;。FROM(SELECTHCll,COUNT(*)ASCARDFROMriWHERE1=1GROUPBYri.iCllHAVINGCOUNTd>=c工ORDERBYCARDDESC)AS線;表線(Tl)Tl,LCllCARDcardwlca《接著,genMatrix()聯(lián)接中間結果7V^和表72以生成如表10所示的滿足行集數(shù)約束^2的中間結果3/2,其相應的SQL語句如下所示。SELECTM2.iC,iVf2.CARDFROM(SELECTri.iCll,r2.工C21,COUNTdASCARDFROMTl,272WHERE1=1ANDri.iCll=ulri.JC12=U22GROUPBYri.iCll,T2.iC21HAVINGCOUNT(">=c2ORDERBYCARDDESC//ulUNIONUNIONselectri.icii,r2.i:c21,COUNT(*)ASCARDFROMri,72WHERE1=1ANDri.JLCll=uxri.JC12=T2.JU22GROUPBYri.iCll,r2.iC21HAVINGCOUNT>=c2ORDERBYCARDDESC//ux)ASAf2表10M2(T1,T2)Tl丄CllT2丄C21CARDcarcUi30"J7card;wv,然后,genMatrix()通過將r2丄d用中間結果M2中的值進行實例化來針對表72構建下述SQL語句,以便生成滿足行集數(shù)約束c3的中間結果Mj,如表11所示。selectm3.:lc,m3.cardFROM(SELECTHC21,COUNT(*)ASCARDFROMr2WHEREr2.工C21=vlGROUPBYr2.iC21HAVINGCOUNT(">=c3ORDERBYCARDDESC//vlUNIONUNIONSELECTT2.iC21,COUNT(*)ASCARDFROMT2WHEREr2.JLC21=vyGROUPBYT2.iC21HAVINGCOUNT(*)〉=c3ORDERBYCARDDESC)ASiVf3表11M3(T2)T2丄C21CARDvlcardvicardvz在聯(lián)接表77和72期間為了滿足行集數(shù)約束c3,需要丟棄中間結果矩陣M2中r么丄czv/的值g矩陣^3中r2.丄c7v/'的任意值的元組。由此,可以得到刪減后的中間結果M2',如下表12所示。表12M2'(T1,T2)Tl丄CllT2丄C21CARDvl'cardwi'vz'類似的,使用中間結果M聯(lián)接表73,以便使結果滿足行集數(shù)約束C4并生成新的中間結果3f4,如表13所示。相應的SQL語句如下所示SELECT線.化,M4.CARDfrom(SELECTri.iCll,T2.iC21,r3.iC31,T3.iC32,COUNT(*)ASCARDfromri,r2,r3WHERE1=1ANDri.iCll=ul'ANDr2.iC21=vl'GROUPBYHCll,HC21,r3.工C31,r3.工C32HAVINGCOUNT(*)>=c4ORDERBYCARDDESC//uvl'UNIONUNIONSELECTTl.I/Cll,T2.iC21,T3.iC31,r3.I;C32,COUNT(*)ASCARDfromri,r2,r3where1=1andri.iCll=uz'ANDr2.iC21=vz'GROUPBYrl.iCll,r2.ic21,r3.ic3:ur3.iC32HAVINGCOUNT(*)>=c4ORDERBYCARDDESC//uvz')ASM4'-表13Af4(Tl,T2,T3)Tl丄CllT2丄C21T3丄C31T3丄C32CARD〃vl","aw謂為了滿足行集數(shù)約束c5,genMatrix()使用中間結果Af4中的值實例化列組(73丄C37,r3丄C^2),從而針對表73構建下述SQL語句,以便生成新的中間結果Afs。SELECTM5.iC,M5.CARDFROM(SELECTr3.iC31,r3.工C32,COUNT(*)ASCARDFROMT3WHERET3.iC31=wlAM)GROUPBYr3._LC31,HAVINGCOUNT(*)>=c5ORDERBYCARDDESC//(wl,ul)UNIONUNIONSELECTr3.1C31,T3.iC32,COUNT(*)ASCARDFROMr3WHEREr3.JLC31=,AATOGROUPBYr3.iC31,r3.1C32HAVINGCOUNT(*)>=c5ORDERBYCARDDESC//(aw,—)ASM5最后,丟棄中間結果A/4中列組(7XLC/,IXLC》(^/,1^的值g中間結果矩陣Ms中列組(T3丄c^,r3丄c"(^y,"》的任意值的元組,以便獲得刪減的最終中間結果M4'??梢钥闯?,使用該中間結果M/進行謂詞^lt實例化能夠滿足行集數(shù)約束集合0{Cl,C2,c3,c4,c5}的要求。以上結合附圖詳細描述了實現(xiàn)本發(fā)明的自動生成數(shù)據(jù)庫查詢的方法的各個具體實施方式,下面將結合圖9描述本發(fā)明的自動生成數(shù)據(jù)庫查詢的系統(tǒng)。如圖9所示,根據(jù)本發(fā)明的一個實施例的自動生成數(shù)據(jù)庫查詢的系統(tǒng)主要包括查詢圖生成模塊910、查詢生成模塊920、以及測試用例生成模塊930。查詢圖生成模塊910用于對輸入的查詢0進行分析,以^更生成其有向查詢圖和有向生成樹。查詢圖生成模塊910主要包括有向查詢圖構建器912,用于對輸入的查詢g構建有向查詢圖;有向生成樹/森林構建器914,用于根據(jù)有向查詢圖構建器所構建的有向查詢圖構建有向生成樹,或者構建有向生成森林并對其進行轉換;圖形可視化器916,用于對有向查詢圖構建器912構建的有向查詢圖和有向生成樹/森林構建器914構建及轉換的有向生成樹/森林進行可視化顯示;以及圖形可視化器用戶接口918,用于實現(xiàn)與用戶的交互。查詢生成模塊920用于對查詢圖生成模塊910所生成的有向生成樹/森林進行遍歷以便生成滿足行集數(shù)約束條件的候選測試查詢。查詢生成模塊920主要包括符號化查詢表示器922,用于將輸入查詢轉化為符號化表示的查詢;矩陣生成器924,用于對查詢圖生成模塊910所生成的有向生成樹/森林進行廣度優(yōu)先搜索,構建SQL語句以便迭代生成中間結果表;謂詞M實例化單元926,用于在矩陣生成器924迭4義生成中間結M期間,根據(jù)上一層次遍歷的中間結果表對新構建的SQL語句中的謂詞^進行實例化表示,從而使得矩陣生成器924生成最終的滿足行集數(shù)約束條件的中間結^;以及候選查詢生成器928,用于根據(jù)矩陣生成器924生成的最終中間結果生成一組候選測試查詢,如果必要,可以選擇輸出滿足相對偏差要求的優(yōu)選測試查詢。其中,符號化查詢表示器922為可選模塊,可以不必對輸入查詢進行符號化而直接處理輸入的查詢,也可以在對輸入查詢進行符號化處理之后發(fā)送給查詢圖生成模塊910,以方i更查詢圖生成模塊的處理。當然,在最終生成測試查詢時,應當將符號化表示的查詢進行反符號化處理,返回到實際查詢中所^^用的查詢元素。測試用例生成模塊930才艮據(jù)查詢生成模塊920所生成的測試查詢生成測試用例,主要包括候選查詢評價器932,用于評價查詢生成模塊920所生成的測試用例候選;測試用例生成器934,用于根據(jù)候選查詢評價器932的評價結果,為用戶4C供符^^要求的測試用例;以及測試用例生成器用戶接口936,用于與用戶交互。以上各個模塊和單元的具體處理過程與上面參照的自動生成數(shù)據(jù)庫查詢的方法的各個實施例中的相應步驟相類似,為了簡潔起見,在此略去其詳細描述。另外,在數(shù)據(jù)庫層950中提供了測試查詢存儲庫952用以保存用戶提供的測試工作負載(一組查詢)的所有相關信息、行集數(shù)約束規(guī)范、以及所生成的可以重復4吏用的測試用例等等。當然,在數(shù)據(jù)庫層950中還M有用于進行查詢測試的測試數(shù)據(jù)庫954。此外,根據(jù)本發(fā)明的自動生成數(shù)據(jù)庫查詢的系統(tǒng)具有很好的擴展性,能夠通過數(shù)據(jù)抽象層940方便地與其他用戶工具和其他外部模塊960集成。例如,外部模塊960中的測試數(shù)據(jù)生成器962、測試自動^f匕工具964、性能測試工具966、數(shù)據(jù)庫測試工具968等工具與本發(fā)明各個實施例所提供的技術方案具有很好的兼容性。還應該指出的是,根據(jù)本發(fā)明的自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng)也支持基于關鍵字和基于相似性的搜索功能。以上結合具體實施例描述了本發(fā)明的基本原理,但是,需要指出的是,對本領域的普通技術人員而言,能夠理解本發(fā)明的方法和裝置的全部或者任何步驟或者部件,可以在任何計算設備(包括處理器、存儲介質等)或者計算設備的網(wǎng)絡中,以硬件、固件、軟件或者它們的組合加以實現(xiàn),這是本領域普通技術人員在閱讀了本發(fā)明的說明的情況下運用他們的基本編程:技能就能實現(xiàn)的,因此在這里省略了詳細il明。因此,基于上述理解,本發(fā)明的目的還可以通過在任何信息處理設備上運行一個程序或者一組程序來實現(xiàn)。所述信息處理設備可以是公知的通用設備。因此,本發(fā)明的目的也可以僅僅通過提供包含實現(xiàn)所述方法或者設備的程序代碼的程序產(chǎn)品來實現(xiàn)。也就是說,這樣的程序產(chǎn)品也構成本發(fā)明,并且存儲有這樣的程序產(chǎn)品的存儲介質也構成本發(fā)明。顯然,所述質,因此也沒有必要在此對各種存儲介質——列舉。在本發(fā)明的設備和方法中,顯然,各部件或各步驟是可以分解和/或重新組合的。這些分解和/或重新組合應視為本發(fā)明的等效方案。并且,是并不需要一定按照時間順序執(zhí)行。某些步驟可以并行或彼此獨立地執(zhí)行。以上描述了本發(fā)明的優(yōu)選實施方式。本領域的普通技術人員知道,本發(fā)明的保護范圍不限于這里所公開的具體細節(jié),而可以具有在本發(fā)明的精神實質范圍內的各種變化和等效方案。權利要求1.一種生成數(shù)據(jù)庫查詢的方法,包括步驟接收輸入查詢和行集數(shù)約束;以及根據(jù)數(shù)據(jù)庫的列組數(shù)據(jù)相關性對輸入查詢的局部謂詞參數(shù)進行實例化,以生成滿足行集數(shù)約束的候選測試查詢。2.根據(jù)權利要求l所述的方法,其中生成測試查詢的步驟包括步驟:為輸入查詢構建有向查詢圖;對有向查詢圖進行遍歷以構建有向生成樹;對有向生成樹進行遍歷以生成中間結果表;以及根據(jù)中間結M生成滿足行集數(shù)約束的候選測試查詢。3.根據(jù)權利要求2所述的方法,其中按照參照完整性關系為輸入查詢構建具有才艮頂點的有向查詢圖;通過深度優(yōu)先遍歷對有向查詢圖進行遍歷以構建有向生成樹;以及通過廣度優(yōu)先搜索對有向生成樹進行遍歷以生成中間結果表。4.根據(jù)權利要求3所述的方法,其中生成中間結果表的步驟按照層次順序對有向生成樹進行遍歷,并且包括步驟針對每一層的有向生成樹遍歷,級聯(lián)輸入查詢中局部謂詞的參照列作為中間結果表的列組;通過對列組值進行分組從數(shù)據(jù)庫中檢索聚合數(shù)據(jù)信息;以及在中間結果表中保留各列組值均滿足行集數(shù)約束的列組值并在中間結果表中記錄行集數(shù)。5.根據(jù)權利要求4所述的方法,其中行集數(shù)約束c為在可接受范圍內的行集數(shù)約束C',并且所述方法還包括根據(jù)"相對偏差-max(^f)"對所生成的候選測試查詢進行評價的步驟,以從中選擇一組期望的測試查詢。6.根據(jù)權利要求1至5任一所述的方法,其中局部謂詞包括等于謂詞、單側i胃詞、以及雙側謂詞。7.根據(jù)權利要求2至5任一所述的方法,其中在為輸入查詢構建的有向查詢圖為多于一個根頂點的情況下,所述方法還包括步驟在構建有向查詢圖之后,標識有向查詢圖中的接合點和橋接弧;在構建有向生成樹之后,通過虛擬弧鏈接不同有向生成樹中的相關頂點,以將構建有向生成樹步驟所構建的多個有向生成樹轉換成有向生成森林;以及在中間結果表生成步驟中分別針對每一個有向生成樹生成中間結果,然后將每一個中間結果表看作臨時表,將虛擬弧作為有向生成樹之間的聯(lián)接關系,以進一步生成最終的中間結果表。8.根據(jù)權利要求2至5任一所述的方法,其中查詢包括子查詢,并且如果子查詢?yōu)橄嚓P子查詢,將其去相關為不相關子查詢;所述方法在生成候選測試查詢之前還包括步驟從最深層的子查詢開始直到最外層子查詢,逐層迭代生成中間結果表。9.根據(jù)權利要求2至5任一所述的方法,其中行集數(shù)約束為多個行集數(shù)約束,分別用于有向生成樹的各層。10.根據(jù)權利要求2至5任一所述的方法,其中在有向生成樹為左深樹的情況下,根據(jù)查詢訪問計劃的的聯(lián)接順序來逐層生成中間結果表。11.一種生成數(shù)據(jù)庫查詢的系統(tǒng),包括有向查詢圖構建器,用于為輸入查詢構建有向查詢圖;有向生成樹構建器,用于對有向查詢圖進行遍歷以構建有向生成樹;矩陣生成器,用于對有向生成樹進行遍歷以生成中間結果表;以及候選查詢生成器,用于根據(jù)中間結果表生成滿足行集數(shù)約束的候選測試查詢。12.根據(jù)權利要求ll所述的系統(tǒng),其中有向查詢圖構建器按照參照完整性關系為輸入查詢構建具有根頂點的有向查詢圖;有向生成樹構建器通過深度優(yōu)先遍歷對有向查詢圖進行遍歷以構建有向生成樹;以及矩陣生成器通過廣度優(yōu)先搜索對有向生成樹進行遍歷以生成中間結13.根據(jù)權利要求12所述的系統(tǒng),其中矩陣生成器按照層次順序對有向生成樹進行遍歷,并且針對每一層的有向生成樹遍歷,級聯(lián)輸入查詢中局部謂詞的參照列作為中間結果表的列組;通it^f列組值進行分組從數(shù)據(jù)庫中檢索聚合數(shù)據(jù)信息;以及在中間結果表中保留各列組值均滿足行集數(shù)約束的列組值并在中間結果表中記錄行集數(shù)。14.根據(jù)權利要求13所述的系統(tǒng),還包括候選查詢評價器,用于根據(jù)"相對偏差-max(f,,)"對候選查詢生成器生成的候選測試查詢進行評價以從中選擇一組期望的測試查詢,其中c為行集數(shù)約束,c'為在可接受范圍內的行集數(shù)約束。15.根據(jù)權利要求11至14任一所述的系統(tǒng),其中局部謂詞包括等于謂詞、單側謂詞、以及雙側謂詞。16.根據(jù)權利要求11至14任一所述的系統(tǒng),其中在有向查詢圖構建器為輸入查詢所構建的有向查詢圖為多于一個才艮頂點的情況下,所述有向查詢圖構建器在構建有向查詢圖之后,標識有向查詢圖中的掩^點和橋接弧;所述有向生成樹構建器在構建有向生成樹之后,通過虛擬弧鏈接不同有向生成樹中的相關頂點,以將構建有向生成樹步驟所構建的多個有向生成樹轉換成有向生成森林;以及所述矩陣生成器分別針對每一個有向生成樹生成中間結果,然后將每一個中間結^看作臨時表,將虛擬弧作為有向生成樹之間的聯(lián)接關系,以進一步生成最終的中間結果表。17.根據(jù)權利要求11至14任一所述的系統(tǒng),其中查詢包括子查詢,并且如果子查詢?yōu)橄嚓P子查詢,將其去相關為不相關子查詢;并且所述矩陣生成器從最深層的子查詢開始直到最外層子查詢,逐層迭^R生成中間結a。18.根據(jù)權利要求11至14任一所述的系統(tǒng),其中行集數(shù)約束為多個行集數(shù)約束,分別用于有向生成樹的各層。19.根據(jù)權利要求11至14任一所述的系統(tǒng),其中在有向生成樹為左深樹的情況下,所述矩陣生成器才艮據(jù)查詢訪問計劃的的聯(lián)接順序來逐層生成中間結果表。20.根據(jù)權利要求11至14任一所述的系統(tǒng),還包括測試查詢存儲庫,用以*輸入查詢的相關信息、行集數(shù)約束規(guī)范、以及所生成的可以重復^f吏用的測試用例。全文摘要本發(fā)明公開了一種自動生成數(shù)據(jù)庫查詢的方法和系統(tǒng),通過考慮列組數(shù)據(jù)相關性和行集數(shù)約束,能夠基于謂詞參數(shù)實例化自動生成用于數(shù)據(jù)庫的查詢。根據(jù)本發(fā)明一個實施例的生成數(shù)據(jù)庫查詢的方法包括接收輸入查詢和行集數(shù)約束;以及根據(jù)數(shù)據(jù)庫的列組數(shù)據(jù)相關性對輸入查詢的局部謂詞參數(shù)進行實例化,以生成滿足行集數(shù)約束的候選測試查詢。所述生成測試查詢的步驟包括步驟為輸入查詢構建有向查詢圖;對有向查詢圖進行遍歷以構建有向生成樹;對有向生成樹進行遍歷以生成中間結果表;以及根據(jù)中間結果表生成滿足行集數(shù)約束的候選測試查詢。文檔編號G06F17/30GK101620606SQ20081012529公開日2010年1月6日申請日期2008年6月30日優(yōu)先權日2008年6月30日發(fā)明者劉長浩,碩武申請人:國際商業(yè)機器公司