專利名稱::游標(biāo)處理系統(tǒng)及方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及數(shù)據(jù)庫系統(tǒng)領(lǐng)域,尤指一種游標(biāo)處理系統(tǒng)及方法。
背景技術(shù):
:由于游標(biāo)可以解決數(shù)據(jù)庫系統(tǒng)的一條SQL(SequentialQueryLanguage,序列查詢語言)語句可以得到多行數(shù)據(jù)而應(yīng)用程序只能一次處理一行數(shù)據(jù)的失配問題,因此目前幾乎所有的數(shù)據(jù)庫系統(tǒng)都支持游標(biāo)。在關(guān)系數(shù)據(jù)庫領(lǐng)域,將游標(biāo)分為服務(wù)端游標(biāo)和客戶端游標(biāo)。其中客戶端游標(biāo)是使用本地內(nèi)存和臨時(shí)磁盤空間在客戶端創(chuàng)建;服務(wù)端游標(biāo)是在服務(wù)器端使用臨時(shí)表或表空間創(chuàng)建。除客戶端批游標(biāo)外,其他客戶端游標(biāo)是逐行向服務(wù)器提交信息的,并由客戶端進(jìn)行管理,也大量存放在服務(wù)器上。無論是客戶端游標(biāo)還是服務(wù)器端游標(biāo),都需要在服務(wù)器或者客戶端申請(qǐng)資源存儲(chǔ)這些結(jié)果集,所不同的只是存儲(chǔ)的位置。下面以服務(wù)端游標(biāo)為例,來描述現(xiàn)有技術(shù)的游標(biāo)處理方法。如圖1所示,包括步驟1)服務(wù)器端接收應(yīng)用程序的游標(biāo)請(qǐng)求,將所述游標(biāo)請(qǐng)求中的SQL語句提取出來,執(zhí)行SQL語句,計(jì)算出所有的結(jié)果,生成結(jié)果集;步驟2)將結(jié)果集存儲(chǔ)在臨時(shí)的結(jié)果集堆中(如果結(jié)果集較小,可能只占用內(nèi)存,否則必須存儲(chǔ)到臨時(shí)表或者臨時(shí)文件中);步驟3)在結(jié)果集生成后,服務(wù)器端告知發(fā)起游標(biāo)請(qǐng)求的應(yīng)用程序游標(biāo)打開已完成;步驟4)所述應(yīng)用程序開始一條一條(也有的實(shí)現(xiàn)中可以一次多條)地向服務(wù)器端發(fā)送獲取數(shù)據(jù)命令;步驟5)服務(wù)器端接收到獲取數(shù)據(jù)命令后,從結(jié)果集中逐條將結(jié)果返回給所述應(yīng)用程序;步驟6)所述應(yīng)用程序完成游標(biāo)訪問后,調(diào)用關(guān)閉游標(biāo)命令;步驟7)服務(wù)器端接收到關(guān)閉游標(biāo)命令后,釋放結(jié)果集。綜上所述,現(xiàn)有技術(shù)的游標(biāo)處理方法具有下列缺點(diǎn)一、在結(jié)果集比較大的情況下,服務(wù)器或客戶端需要存儲(chǔ)大量的中間數(shù)據(jù)(結(jié)果集堆),這樣會(huì)占用很多的外存空間,頻繁訪問外存會(huì)導(dǎo)致游標(biāo)的代價(jià)迅速上升;如果使用服務(wù)器游標(biāo)的用戶過多,會(huì)造成服務(wù)器上臨時(shí)表的資源耗盡,并且對(duì)服務(wù)器的CPU提出較高的要求。二、由于總是在把所有的結(jié)果計(jì)算出來后才告知應(yīng)用程序游標(biāo)打開完成,也就是說要等到所有的結(jié)果都計(jì)算出來后應(yīng)用程序才能夠獲得結(jié)果,因此,在結(jié)果集較大的情況下,應(yīng)用程序就不得不進(jìn)行漫長的等待,雖然其需求的第一個(gè)結(jié)果已經(jīng)計(jì)算出來,可是只有當(dāng)所有結(jié)果都計(jì)算出來后,應(yīng)用程序才能獲得其需求的第一個(gè)結(jié)果,其首行數(shù)據(jù)響應(yīng)時(shí)間=計(jì)算整個(gè)游標(biāo)的時(shí)間+發(fā)送第一條數(shù)據(jù)的時(shí)間,這樣就造成游標(biāo)的首次讀取的響應(yīng)時(shí)間過長。三、當(dāng)應(yīng)用程序獲得第一個(gè)結(jié)果時(shí),所有的結(jié)果都已計(jì)算出來,如果用戶不需要全部數(shù)據(jù),那么所做的計(jì)算和存儲(chǔ)工作也就成了無用功。
發(fā)明內(nèi)容本發(fā)明要解決的問題是提供一種能夠提高游標(biāo)響應(yīng)速度且減少服務(wù)器資源耗費(fèi)的游標(biāo)處理系統(tǒng)。為了解決上述問題,一種游標(biāo)處理系統(tǒng)包括服務(wù)器端游標(biāo)組件、查詢執(zhí)行組件和查詢?cè)僮鲌?zhí)行組件,其中,所述服務(wù)器端游標(biāo)組件,用于根據(jù)游標(biāo)定義形成查詢計(jì)劃,并將查詢計(jì)劃發(fā)送給所述查詢執(zhí)行組件,且接收查詢執(zhí)行組件的結(jié)果并將該結(jié)果返回;所述查詢執(zhí)行組件,用于將查詢計(jì)劃分解為一個(gè)個(gè)元操作及每一個(gè)元操作涉及的參數(shù)和條件,并將元操作及其涉及的參數(shù)和條件依次發(fā)給所述查詢?cè)僮鲌?zhí)行組件,接收所述查詢?cè)僮鲌?zhí)行組件的執(zhí)行結(jié)果;所述查詢?cè)僮鲌?zhí)行組件,用于根據(jù)元操作所涉及的參數(shù)和條件執(zhí)行元操作。進(jìn)一步地,本發(fā)明游標(biāo)處理系統(tǒng)還包括用于通過對(duì)所述查詢?cè)僮鲌?zhí)行組件執(zhí)行所得結(jié)果加鎖來保持?jǐn)?shù)據(jù)庫一致性的物理存取組件。進(jìn)一步地,本發(fā)明游標(biāo)處理系統(tǒng)還包括用于接收游標(biāo)定義并將其發(fā)送給服務(wù)器端游標(biāo)組件的客戶端游標(biāo)組件。所述元操作指不可再分的操作相應(yīng)地,一種游標(biāo)處理方法包括步驟10)根據(jù)游標(biāo)定義形成查詢計(jì)劃;步驟20)將查詢計(jì)劃分解為一個(gè)個(gè)元操作及每一個(gè)元操作涉及的參數(shù)和條件;步驟30)根據(jù)元操作涉及的參數(shù)和條件依次執(zhí)行這些元操作;步驟40)判斷是否取得一條結(jié)果;若已取得一條結(jié)果,則步驟50)將已取得的結(jié)果返回給游標(biāo)請(qǐng)求者,否則步驟60)判斷游標(biāo)所請(qǐng)求的表中是否還有數(shù)據(jù);若有,則轉(zhuǎn)到步驟30),否則步驟70)結(jié)束。所述步驟10)進(jìn)一步分為11)對(duì)游標(biāo)請(qǐng)求進(jìn)行語法分析形成查詢語法分析樹;12)對(duì)查詢語法分析樹進(jìn)行類型檢查形成具有類型信息的查詢優(yōu)化樹;13)根據(jù)優(yōu)化規(guī)則對(duì)查詢優(yōu)化樹進(jìn)行優(yōu)化形成查詢計(jì)劃。所述步驟20)中所述元操作指不可再分的操作。與現(xiàn)有技術(shù)相比,本發(fā)明游標(biāo)處理系統(tǒng)的有益效果由于查詢執(zhí)行組件將查詢計(jì)劃分解為一個(gè)個(gè)元操作及其參數(shù)和條件,查詢?cè)僮鲌?zhí)行組件用于執(zhí)行元操作,即執(zhí)行對(duì)數(shù)據(jù)庫表的操作,從中取出一條結(jié)果,并將該結(jié)果傳給所述查詢執(zhí)行組件,所述查詢執(zhí)行組件在將該結(jié)果傳遞服務(wù)器端組件,由服務(wù)器端組件將查詢結(jié)果發(fā)送給游標(biāo)請(qǐng)求者。也就是說,每取得一個(gè)結(jié)果,就將該結(jié)果發(fā)送給游標(biāo)請(qǐng)求者,而不必等到所有的結(jié)果都取得后在依次發(fā)送給游標(biāo)請(qǐng)求者,其首行數(shù)據(jù)響應(yīng)時(shí)間=計(jì)算游標(biāo)第一行數(shù)據(jù)的時(shí)間+發(fā)送第一條數(shù)據(jù)的時(shí)間,因而大大提高了游標(biāo)響應(yīng)速度。由于本發(fā)明游標(biāo)處理系統(tǒng)取得一條結(jié)果后便將結(jié)果發(fā)送給游標(biāo)請(qǐng)求者,而不需要空間來存儲(chǔ),不會(huì)耗費(fèi)服務(wù)器的資源。由于本發(fā)明游標(biāo)處理系統(tǒng)取得一條結(jié)果后便將結(jié)果發(fā)送給游標(biāo)請(qǐng)求者,如果游標(biāo)請(qǐng)求者不再需要其他的結(jié)果,就不必再去計(jì)算其他的結(jié)果,這樣大大減少了I/O及CPU的開銷。同理本發(fā)明游標(biāo)處理方法也具有上述有益效果。圖1是現(xiàn)有技術(shù)游標(biāo)處理方法的流程圖;圖2是本發(fā)明游標(biāo)處理系統(tǒng)的結(jié)構(gòu)圖;圖3是服務(wù)器端游標(biāo)組件查詢計(jì)劃形成流程圖;圖4是查詢執(zhí)行組件實(shí)現(xiàn)的流程圖;圖5是查詢?cè)僮鲌?zhí)行組件實(shí)現(xiàn)的流程圖;圖6是物理存取組件實(shí)現(xiàn)的流程圖;圖7是本發(fā)明游標(biāo)處理方法的流程圖。圖8是第二個(gè)實(shí)施例分解的元操作樹圖具體實(shí)施方式如圖2所示,本發(fā)明游標(biāo)處理系統(tǒng)包括服務(wù)器端游標(biāo)組件101、查詢執(zhí)行組件102和查詢?cè)僮鲌?zhí)行組件103,其中,所述服務(wù)器端游標(biāo)組件101,用于根據(jù)游標(biāo)請(qǐng)求形成查詢計(jì)劃,并將查詢計(jì)劃發(fā)送給所述查詢執(zhí)行組件102,且接收查詢執(zhí)行組件102的結(jié)果并將該結(jié)果返回;所述查詢執(zhí)行組件102,用于將查詢計(jì)劃分解為一個(gè)個(gè)元操作及每一個(gè)元操作涉及的參數(shù)和條件,并將元操作及其涉及的參數(shù)和條件依次發(fā)給所述查詢?cè)僮鲌?zhí)行組件103,接收所述查詢?cè)僮鲌?zhí)行組件103的執(zhí)行結(jié)果;所述元操作指不可再分的操作,例如關(guān)系數(shù)據(jù)庫的理論基石關(guān)系代數(shù)基本的選擇操作、投影操作、排序操作、連接操作、笛卡爾積操作、分組和聚集函數(shù)操作、消除重復(fù)操作、集合并交差操作、可重復(fù)集并交差操作及子查詢處理操作等;所述查詢?cè)僮鲌?zhí)行組件103,用于根據(jù)元操作所涉及的參數(shù)和條件執(zhí)行元操作。進(jìn)一步地,還包括用于通過對(duì)所述查詢?cè)僮鲌?zhí)行組件103執(zhí)行所得結(jié)果加鎖來保持?jǐn)?shù)據(jù)庫一致性的物理存取組件104。進(jìn)一步地,還包括用于接收游標(biāo)請(qǐng)求并將其發(fā)送給所述服務(wù)器端游標(biāo)組件101的客戶端游標(biāo)組件105??蛻舳擞螛?biāo)組件105接收用戶的游標(biāo)請(qǐng)求,通過網(wǎng)絡(luò)將其發(fā)送給服務(wù)器端游標(biāo)組件101,服務(wù)器端游標(biāo)組件101根據(jù)游標(biāo)請(qǐng)求形成查詢計(jì)劃,查詢執(zhí)行組件102將查詢計(jì)劃分解為一個(gè)個(gè)元操作及其參數(shù)和條件,并將元操作及其參數(shù)和條件依次發(fā)送至查詢?cè)僮鲌?zhí)行組件103,查詢?cè)僮鲌?zhí)行組件103根據(jù)元操作涉及的參數(shù)和條件執(zhí)行元操作,執(zhí)行元操作也就是從其需求的數(shù)據(jù)庫表中取得其需要的結(jié)果數(shù)據(jù),物理存取組件104將其所需要的結(jié)果數(shù)據(jù)加鎖后,再將其經(jīng)查詢?cè)僮鲌?zhí)行組件103傳遞給查詢執(zhí)行組件102,查詢執(zhí)行組件102將該查詢計(jì)劃所分解后的元操作都執(zhí)行后的最后結(jié)果傳遞給服務(wù)器端游標(biāo)組件101,由服務(wù)器端游標(biāo)組件101將結(jié)果發(fā)送給用戶,或者經(jīng)過客戶端游標(biāo)組件105發(fā)送給用戶。一個(gè)結(jié)果得到后,若還需要后序結(jié)果,用戶只需繼續(xù)發(fā)送向服務(wù)器端游標(biāo)組件101發(fā)送獲取(Fetch)命令,查詢執(zhí)行組件102、查詢?cè)僮鲌?zhí)行組件103和物理存取組件104還會(huì)繼續(xù)去計(jì)算下一個(gè)結(jié)果。如圖3所示,服務(wù)器端游標(biāo)組件101包括用于分析游標(biāo)請(qǐng)求語法并形成查詢語法分析樹的語法分析器1011、根據(jù)數(shù)據(jù)字典和查詢語法分析樹形成具有類型信息的查詢優(yōu)化樹的類型檢查器1012和根據(jù)通用規(guī)則和特定應(yīng)用規(guī)則對(duì)查詢優(yōu)化樹優(yōu)化而形成查詢計(jì)劃的查詢優(yōu)化器1013。所述類型信息查詢優(yōu)化樹中使用到的每個(gè)數(shù)據(jù)項(xiàng)的類型,包括Int、Float、Char、Varchar等OSCAR數(shù)據(jù)庫中所支持的類型。所述類型檢查器1012檢查查詢優(yōu)化樹中所出現(xiàn)的每個(gè)數(shù)據(jù)項(xiàng)是否存在,如存在還要檢查其類型是否匹配等。如圖4所示,查詢執(zhí)行組件102的實(shí)現(xiàn)流程如下步驟1021)將查詢計(jì)劃分解為一個(gè)個(gè)元操作及每一個(gè)元操作涉及的參數(shù)和條件;步驟1022)取出一個(gè)元操作及其涉及的參數(shù)和條件,并將其傳遞給查詢?cè)僮鲌?zhí)行組件103;步驟1023)判斷是否接收到查詢?cè)僮鲌?zhí)行組件103執(zhí)行結(jié)果;若沒有接收到,則步驟1024)向服務(wù)器端游標(biāo)組件101返回?zé)o結(jié)果,否則步驟1025)判斷是否還有未執(zhí)行的元操作;若還有未執(zhí)行的元操作,則轉(zhuǎn)到步驟1022),否則步驟1026)將結(jié)果傳遞給服務(wù)器端游標(biāo)組件101。如圖5所示,查詢?cè)僮鲌?zhí)行組件103的實(shí)現(xiàn)流程如下步驟1030)向物理存取組件104發(fā)送數(shù)據(jù)請(qǐng)求;步驟1031)判斷是否接收到物理存取組件104傳來的數(shù)據(jù);若沒有,則步驟1032)向查詢執(zhí)行組件102返回?zé)o結(jié)果,否則步驟1033)執(zhí)行元操作;步驟1034)判斷是否有過濾條件;若沒有,則步驟1035)將結(jié)果傳遞給查詢執(zhí)行組件102,否則步驟1036)執(zhí)行過濾條件表達(dá)式;步驟1037)判斷是否滿足過濾條件;若不滿足,則轉(zhuǎn)到步驟1030),否則步驟1038)將結(jié)果傳遞給查詢執(zhí)行組件102。如圖6所示,物理存取組件104實(shí)現(xiàn)流程如下步驟1040)判斷查詢?cè)僮鲌?zhí)行組件103所請(qǐng)求的表是否還有數(shù)據(jù);若沒有,則步驟1041)向查詢?cè)僮鲌?zhí)行組件103返回?zé)o結(jié)果,否則執(zhí)行步驟1042)取出數(shù)據(jù);步驟1043)將所取出的數(shù)據(jù)加鎖;步驟1044)判斷加鎖是否成功;若成功,則步驟1045)將結(jié)果傳遞給查詢?cè)僮鲌?zhí)行組件103,否則步驟1046)等待獲得鎖;步驟1047)判斷是否獲得鎖;若否,則步驟1048)向查詢?cè)僮鲌?zhí)行組件103返回出錯(cuò),否則步驟1049)將結(jié)果傳遞給查詢?cè)僮鲌?zhí)行組件103。下面以訪問北京神舟軟件有限公司開發(fā)的OSCAR數(shù)據(jù)庫為例來詳述本發(fā)明游標(biāo)處理系統(tǒng)的技術(shù)方案。本例管理員要查看0SCAR數(shù)據(jù)庫的基礎(chǔ)表BASETABLE中的全部滿足條件的數(shù)據(jù)。該表約有300萬條數(shù)據(jù)。管理員(DBA)定義的游標(biāo)為Declarecursorforselect*frombasetablewherebtcodelike‘330011%’。(DBA可能要查看表中的全部滿足編號(hào)為330011開頭的數(shù)據(jù))客戶端游標(biāo)組件105將該游標(biāo)定義以網(wǎng)絡(luò)包的形式傳送到服務(wù)器端游標(biāo)組件101,服務(wù)器端游標(biāo)組件101通過對(duì)游標(biāo)定義進(jìn)行語法分析生成一個(gè)查詢計(jì)劃,查詢計(jì)劃如下表所示+---------------------------------------------------------------+|QUERYPLAN|+---------------------------------------------------------------+|SeqScanonBASETABLE(cost=0.00..4.01rows=1425537width=240)||Filter(BT_CODELIKE′330011%′)|+---------------------------------------------------------------+注這個(gè)查詢計(jì)劃指出這個(gè)查詢是調(diào)用一個(gè)選擇元操作,從表BASETABLE中通過SeqScan(表的順序掃描)獲得數(shù)據(jù),并使用條件’BT_CODELIKE‘330011%’來過濾查詢結(jié)果。其操作代價(jià)為0.00...4.01之間,可能查詢出的結(jié)果為1425537行,每行的平均寬度為240字節(jié)。該查詢計(jì)劃被傳遞給查詢執(zhí)行組件102,查詢執(zhí)行組件102將該查詢計(jì)劃分解為一個(gè)元操作選擇及其涉及的參數(shù)為表BASETABLE和過濾條件’BT_CODELIKE‘330011%’。查詢執(zhí)行組件102將元操作選擇及其涉及的參數(shù)為表BASETABLE和過濾條件’BT_CODELIKE‘330011%’傳遞給查詢?cè)僮鲌?zhí)行組件103,查詢?cè)僮鲌?zhí)行組件103向物理存取組件104請(qǐng)求取得表BASETABLE中的數(shù)據(jù),物理存取組件104從該表中取出一個(gè)基本元組(張三,01,19660901,0,7,330011660901055,....)給查詢?cè)僮鲌?zhí)行組件103。查詢?cè)僮鲌?zhí)行組件103對(duì)該行數(shù)據(jù)按條件BT_CODELIKE‘330011%’進(jìn)行選擇,該結(jié)果滿足過濾條件,則將該結(jié)果返回給查詢執(zhí)行組件102。因?yàn)樵摬樵冇?jì)劃只分解為一個(gè)元操作,即表明沒有未執(zhí)行的元操作,故查詢執(zhí)行組件102得到該結(jié)果后,將該結(jié)果傳遞給服務(wù)器端游標(biāo)組件101,服務(wù)器端游標(biāo)組件101再把該結(jié)果封裝成包的形式,通過網(wǎng)絡(luò)協(xié)議發(fā)給客戶端游標(biāo)組件105,客戶端游標(biāo)組件105把結(jié)果解包后,返回給DBA工具。下面給出另一個(gè)實(shí)施例DBA查看視圖V_Student_Course中的全部數(shù)據(jù)的過程。視圖V_Student_Course的定義createviewV_Student_courseasSELECTSTUDENT.SNAME,COURSE.CNAMEFROMSTUDENTINNERJOINELECTONstudent.SNO=elect.snoINNERJOINCOURSEONcourse.cno=elect.cno;這個(gè)視圖依賴于三個(gè)基表,即STUDENT、COURSE和EJECT表,定義如下CREATETABLESTUDENT(--學(xué)生基本情況表SNOCHAR(8),--學(xué)號(hào)SNAMEVARCHAR(16),--姓名SDEPTVARCHAR(8),--所在系SAGEINT,--年齡SGENDERCHAR(1),--性別(′M′表示男,′F′表示女)SCREDITNUMERIC(4,1)DEFAULT0,--總學(xué)分PRIMARYKEY(SNO));CREATETABLECOURSE(--課程信息表CNOCHAR(4),--課程號(hào)CNAMEVARCHAR(64),--課程名CDEPTVARCHAR(8),--開課的系CCREDITNUMERIC(3,1),--學(xué)分PRIMARYKEY(CNO));DBA定義游標(biāo)為Declarecursorforselect*fromV_Student_Course。(DBA可能要查看視圖中的全部數(shù)據(jù))該游標(biāo)定義被以網(wǎng)絡(luò)包的形式傳送到服務(wù)器端游標(biāo)組件101,通過對(duì)其進(jìn)行語法分析,服務(wù)器端游標(biāo)組件101為該游標(biāo)定義形成一個(gè)查詢計(jì)劃,下表是在OSCAR數(shù)據(jù)庫中使用explain命令得到的該查詢計(jì)劃的一個(gè)描述。explainselect*fromV_Student_Course;QUERYPLANNestedLoop(cost=0.00..28.45rows=1width=110)->NestedLoop(cost=0.00..20.79rows=4width=52)JoinCond(″outer″.SNO=″inner″.SNO)->IndexScanusingSTUDENTPKEYonSTUDENT(cost=0.00..3.71rows=4width=32)->SeqScanonELECT(cost=0.00..4.12rows=12width=20)->IndexScanusingCOURSEPKEYonCOURSE(cost=0.00..1.90rows=1width=58)IndexCond(COURSE.CNO=″outer″.CNO)注這個(gè)查詢計(jì)劃指出這個(gè)查詢是調(diào)用一個(gè)連接元操作,從表STUDENT及表ELECT的連接結(jié)果中得到一行數(shù)據(jù),然后從表COURSE中使用選擇元操作得到一行數(shù)據(jù)進(jìn)行匹配,成功后返回,否則繼續(xù)。如圖8所示,查詢計(jì)劃被傳遞給查詢執(zhí)行組件102,查詢執(zhí)行組件102將該查詢計(jì)劃分解其為第一元操作選擇,參數(shù)表STUDENT,索引STUDENT_PKEY。第二元操作選擇,參數(shù)表ELECT;第一元操作連接,參數(shù)第一元操作選擇的結(jié)果和第二元操作選擇的結(jié)果,連接條件為JOINCOND(″outer″.SNO=″inner″.SNO),即STUDENT.SNO=ELECT.SNO。第三元操作選擇,參數(shù)為表COURSE,索引COURSE_PKEY,和索引條件COURSE.CNO=″outer″.CNO,即COURSE.CNO=ELECT.CNO。第二元操作連接,參數(shù)第一元操作連接的結(jié)果和第三元操作選擇的結(jié)果,連接條件為空。查詢執(zhí)行組件102將元操作選擇及參數(shù)STUDENT_PKEY傳遞給查詢?cè)僮鲌?zhí)行組件103,查詢?cè)僮鲌?zhí)行組件103向物理存取組件104請(qǐng)求訪問索引STUDENT_PKEY,并得到該索引對(duì)應(yīng)的表STUDENT中的一行數(shù)據(jù)(S0000001,王某,計(jì)算機(jī),23,M,14.0)。查詢執(zhí)行組件102得到該行數(shù)據(jù)后,判斷還有未執(zhí)行的元操作,則將元操作選擇及參數(shù)ELECT傳遞給查詢?cè)僮鲌?zhí)行組件103,并得到該表中的一行數(shù)據(jù)(S0000001,C001,84.0)。查詢執(zhí)行組件102判斷還有未執(zhí)行的元操作,則將連接元操作、前兩次執(zhí)行結(jié)束的元操作所得到的數(shù)據(jù)以及條件傳遞給查詢?cè)僮鲌?zhí)行組件103。元操作執(zhí)行組件103執(zhí)行一個(gè)連接操作,連接條件是Cond(″outer″.SNO=″inner″.SNO),得到結(jié)果為(S0000001,王某,C001),其它列因?yàn)椴恍枰?,被該操作去除。并將該結(jié)果返回給查詢執(zhí)行組件102。查詢執(zhí)行組件102判斷還有未執(zhí)行的元操作,便將該元操作選擇及參數(shù)COURSE和COURSE_PKEY及ELECT.CNO即’C001’,傳遞給查詢?cè)僮鲌?zhí)行組件103,并得到該表中的一行數(shù)據(jù)即(C001,C程序設(shè)計(jì),計(jì)算機(jī),3.0)。查詢組件102判斷還有未執(zhí)行的元操作,便將連接元操作、前兩次執(zhí)行結(jié)束的元操作所得到的數(shù)據(jù)傳遞給查詢?cè)僮鲌?zhí)行組件103。元操作執(zhí)行組件103執(zhí)行一個(gè)連接操作,無連接條件,得到結(jié)果為(王某,C程序設(shè)計(jì)),其它列因?yàn)椴恍枰辉摬僮魅コ?。并將該結(jié)果返回給查詢執(zhí)行組件102。查詢執(zhí)行組件102判斷沒有未執(zhí)行的元操作,便將該結(jié)果返回給服務(wù)器端游標(biāo)組件101。服務(wù)器端游標(biāo)組件101把該結(jié)果封裝成網(wǎng)絡(luò)包的形式,通過TCP協(xié)議發(fā)送該網(wǎng)絡(luò)包至客戶端游標(biāo)組件105??蛻舳擞螛?biāo)組件105把結(jié)果解包后,返回給DBA,DBA獲得第一個(gè)數(shù)據(jù)(王某,C程序設(shè)計(jì)),表示學(xué)生王某選擇了C程序設(shè)計(jì)這門課,重復(fù)發(fā)送FETCH請(qǐng)求50次,即可獲得50個(gè)數(shù)據(jù)。相應(yīng)地,如圖7,本發(fā)明游標(biāo)處理方法包括步驟10)根據(jù)游標(biāo)請(qǐng)求形成查詢計(jì)劃;步驟20)將查詢計(jì)劃分解為一個(gè)個(gè)元操作及每一個(gè)元操作涉及的參數(shù)和條件;步驟30)根據(jù)元操作涉及的參數(shù)和條件依次執(zhí)行這些元操作;步驟40)判斷是否取得一條結(jié)果;若已取得一條結(jié)果,則步驟50)將已取得的結(jié)果返回給用戶,否則步驟60)判斷所請(qǐng)求的表中是否還有數(shù)據(jù);若有,則轉(zhuǎn)到步驟30),否則步驟70)結(jié)束。進(jìn)一步地,所述步驟10)進(jìn)一步分為11)對(duì)游標(biāo)請(qǐng)求進(jìn)行語法分析形成查詢語法分析樹;12)對(duì)查詢語法分析樹進(jìn)行類型檢查形成具有類型信息的查詢優(yōu)化樹;13)根據(jù)優(yōu)化規(guī)則(如通用規(guī)則及特定應(yīng)用規(guī)則)對(duì)查詢優(yōu)化樹進(jìn)行優(yōu)化形成查詢計(jì)劃。步驟20)中所述元操作指不可再分的操作,如選擇操作、連接操作等。本發(fā)明游標(biāo)處理方法對(duì)游標(biāo)定義進(jìn)行語法分析形成查詢計(jì)劃,再將查詢計(jì)劃分解為一個(gè)個(gè)元操作及每一個(gè)元操作涉及的參數(shù)和條件,依次執(zhí)行這些元操作,并將最后結(jié)果返回,即取得一個(gè)結(jié)果就將其返回以上所述僅是本發(fā)明游標(biāo)處理系統(tǒng)及方法的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本
技術(shù)領(lǐng)域:
的普通技術(shù)人員來說,在不脫離本發(fā)明游標(biāo)處理系統(tǒng)及方法原理的前提下,還可以作出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明游標(biāo)處理系統(tǒng)及方法的保護(hù)范圍。權(quán)利要求1.一種游標(biāo)處理系統(tǒng),其特征在于,包括服務(wù)器端游標(biāo)組件、查詢執(zhí)行組件和查詢?cè)僮鲌?zhí)行組件,其中,所述服務(wù)器端游標(biāo)組件,用于根據(jù)游標(biāo)定義形成查詢計(jì)劃,并將查詢計(jì)劃發(fā)送給所述查詢執(zhí)行組件,且接收查詢執(zhí)行組件的結(jié)果并將該結(jié)果返回;所述查詢執(zhí)行組件,用于將查詢計(jì)劃分解為一個(gè)個(gè)元操作及每一個(gè)元操作涉及的參數(shù)和條件,并將元操作及其涉及的參數(shù)和條件依次發(fā)給所述查詢?cè)僮鲌?zhí)行組件,接收所述查詢?cè)僮鲌?zhí)行組件的執(zhí)行結(jié)果;所述查詢?cè)僮鲌?zhí)行組件,用于根據(jù)元操作所涉及的參數(shù)和條件執(zhí)行元操作。2.如權(quán)利要求1所述的游標(biāo)處理系統(tǒng),其特征在于,還包括用于通過對(duì)所述查詢?cè)僮鲌?zhí)行組件執(zhí)行所得結(jié)果加鎖來保持?jǐn)?shù)據(jù)庫一致性的物理存取組件。3.如權(quán)利要求2所述的游標(biāo)處理系統(tǒng),其特征在于,還包括用于接收游標(biāo)定義并將其發(fā)送給服務(wù)器端游標(biāo)組件的客戶端游標(biāo)組件。4.如權(quán)利要求1至3所述的任意一種游標(biāo)處理系統(tǒng),其特征在于,所述元操作指不可再分的操作。5.一種游標(biāo)處理方法,其特征在于,包括步驟10)根據(jù)游標(biāo)定義形成查詢計(jì)劃;步驟20)將查詢計(jì)劃分解為一個(gè)個(gè)元操作及每一個(gè)元操作涉及的參數(shù)和條件;步驟30)根據(jù)元操作涉及的參數(shù)和條件依次執(zhí)行這些元操作;步驟40)判斷是否取得一條結(jié)果;若已取得一條結(jié)果,則步驟50)將已取得的結(jié)果返回給游標(biāo)請(qǐng)求者,否則步驟60)判斷游標(biāo)所請(qǐng)求的表中是否還有數(shù)據(jù);若有,則轉(zhuǎn)到步驟30),否則步驟70)結(jié)束。6.如權(quán)利要求5所述的游標(biāo)處理方法,其特征在于,所述步驟10)進(jìn)一步分為11)對(duì)游標(biāo)請(qǐng)求進(jìn)行語法分析形成查詢語法分析樹;12)對(duì)查詢語法分析樹進(jìn)行類型檢查形成具有類型信息的查詢優(yōu)化樹;13)根據(jù)優(yōu)化規(guī)則對(duì)查詢優(yōu)化樹進(jìn)行優(yōu)化形成查詢計(jì)劃。7.如權(quán)利要求5或者6所述的游標(biāo)處理方法,其特征在于,步驟20)中所述元操作指不可再分的操作。全文摘要本發(fā)明公開一種游標(biāo)處理系統(tǒng),包括服務(wù)器端游標(biāo)組件、查詢執(zhí)行組件和查詢?cè)僮鲌?zhí)行組件。相應(yīng)地,本發(fā)明還公開一種游標(biāo)處理方法包括步驟10)根據(jù)游標(biāo)定義形成查詢計(jì)劃;步驟20)將查詢計(jì)劃分解為一個(gè)個(gè)元操作及每一個(gè)元操作涉及的參數(shù)和條件;步驟30)根據(jù)元操作涉及的參數(shù)和條件依次執(zhí)行這些元操作;步驟40)判斷是否取得一條結(jié)果;若已取得一條結(jié)果,則步驟50)將已取得的結(jié)果返回給游標(biāo)請(qǐng)求者,否則步驟60)判斷游標(biāo)所請(qǐng)求的表中是否還有數(shù)據(jù);若有,則轉(zhuǎn)到步驟30),否則步驟70)結(jié)束。采用本發(fā)明游標(biāo)處理系統(tǒng)及方法能夠計(jì)算出一條結(jié)果就將該結(jié)果返給用戶,因此本發(fā)明游標(biāo)處理系統(tǒng)及方法能夠提高游標(biāo)相應(yīng)速度,減小資源耗費(fèi)。文檔編號(hào)G06F17/30GK1770145SQ200410086888公開日2006年5月10日申請(qǐng)日期2004年11月4日優(yōu)先權(quán)日2004年11月4日發(fā)明者顧云蘇,何清法,陳剛,榮文戈,張淑鋒申請(qǐng)人:北京神舟航天軟件技術(shù)有限公司