專(zhuān)利名稱:以多線程不同驅(qū)動(dòng)源執(zhí)行計(jì)劃處理查詢的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明的實(shí)施例總體上涉及計(jì)算機(jī)系統(tǒng)并且更具體地涉及使用執(zhí)行計(jì)劃處理查詢的數(shù)據(jù)庫(kù)管理系統(tǒng)。
背景技術(shù):
計(jì)算機(jī)系統(tǒng)通常包括計(jì)算機(jī)程序與硬件(諸如半導(dǎo)體、晶體管、芯片、電路板、存儲(chǔ)設(shè)備和處理器)的組合。計(jì)算機(jī)程序存儲(chǔ)于存儲(chǔ)設(shè)備中并且由處理器執(zhí)行?;旧希?jì)算機(jī)系統(tǒng)用于存儲(chǔ)、操縱和分析數(shù)據(jù)。一種用于管理數(shù)據(jù)的機(jī)制被稱為數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)或者簡(jiǎn)稱為數(shù)據(jù)庫(kù)。已知許多不同類(lèi)型的數(shù)據(jù)庫(kù),但是最常見(jiàn)的數(shù)據(jù)庫(kù)常被稱為關(guān)系數(shù)據(jù)庫(kù)(RDB),該關(guān)系數(shù)據(jù)庫(kù)以表的形式組織數(shù)據(jù),這些表具有如下行和如下列、字段或者屬性,這些行代表數(shù)據(jù)庫(kù)中的各個(gè)條目、元組或者記錄,這些列、字段或者屬性限定什么存儲(chǔ)于每個(gè)條目、元組或者記錄中。每個(gè)表在數(shù)據(jù)庫(kù)內(nèi)具有唯一名稱,并且每列在特定表內(nèi)具有唯一名稱。數(shù)據(jù)庫(kù)還具有一個(gè)或者多個(gè)索引,這些索引是如下數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)向DBMS告知在給定編索引的列值時(shí)某行在表中的位置,這類(lèi)似于向讀者告知給定的字詞出現(xiàn)于哪一頁(yè)的書(shū)本索引。從數(shù)據(jù)庫(kù)檢索數(shù)據(jù)的最常見(jiàn)方式是通過(guò)可以源于用戶接口、應(yīng)用程序或者遠(yuǎn)程計(jì)算機(jī)系統(tǒng)(諸如客戶端或者對(duì)等體)的語(yǔ)句(稱為數(shù)據(jù)庫(kù)查詢)。查詢是為了從數(shù)據(jù)庫(kù)檢索滿足或者符合在查詢中指定的標(biāo)準(zhǔn)或者條件的、由DBMS賦值的表達(dá)式。雖然查詢要求作為響應(yīng)而返回特定數(shù)據(jù)集,但是查詢通常不指定查詢執(zhí)行方法。因此,在DBMS接收到查詢之后,DBMS解釋查詢并且確定需要什么內(nèi)部步驟來(lái)滿足查詢。這些內(nèi)部步驟可以包括標(biāo)識(shí)在查詢中指定的一個(gè)或者多個(gè)表、在查詢中選擇的一行或者多行以及其它信息(諸如是否使用現(xiàn)有索引、是否構(gòu)建臨時(shí)索引、是否使用臨時(shí)文件來(lái)執(zhí)行排序和/或?yàn)榱藵M足查詢而將把表聯(lián)接在一起的順序)。這些內(nèi)部步驟放在一起稱為執(zhí)行計(jì)劃。DBMS經(jīng)常保存執(zhí)行計(jì)劃并且在用戶或者請(qǐng)求程序重復(fù)查詢時(shí)(這經(jīng)常出現(xiàn))重用它,而不是經(jīng)歷重新創(chuàng)建執(zhí)行計(jì)劃這樣的耗時(shí)過(guò)程。可以針對(duì)任一查詢創(chuàng)建多個(gè)不同執(zhí)行計(jì)劃,每個(gè)執(zhí)行計(jì)劃將返回滿足查詢的相同數(shù)據(jù)集,而不同執(zhí)行計(jì)劃可以提供廣泛的不同性能。因此,DBMS選擇的執(zhí)行計(jì)劃需要在時(shí)間和硬件資源方面以合理成本提供所需數(shù)據(jù)。因此,DBMS經(jīng)常創(chuàng)建多個(gè)前瞻執(zhí)行計(jì)劃,并且繼而選擇最佳、最快或者成本最少的執(zhí)行計(jì)劃來(lái)執(zhí)行。一個(gè)影響特定執(zhí)行計(jì)劃的成本的因素是執(zhí)行計(jì)劃在執(zhí)行時(shí)從數(shù)據(jù)庫(kù)表返回的行數(shù)。一個(gè)影響所處理的行數(shù)的重要方面是表的聯(lián)接順序。響應(yīng)于向多個(gè)表請(qǐng)求數(shù)據(jù)的查詢,DBMS聯(lián)接來(lái)自這些多個(gè)表的行(行經(jīng)常被水平串聯(lián)成結(jié)果集合),以便從所有表中發(fā)現(xiàn)和檢索數(shù)據(jù)。因此,聯(lián)接運(yùn)算是查詢(聯(lián)接查詢)所訪問(wèn)的兩個(gè)表之間的關(guān)系,并且執(zhí)行聯(lián)接運(yùn)算以連接(或者聯(lián)接)來(lái)自兩個(gè)或者更多表的數(shù)據(jù),其中DBMS將具有特定屬性的行聯(lián)接在一起以形成DBMS向結(jié)果集合保存的新行。聯(lián)接順序通常由執(zhí)行計(jì)劃指定并且是如下順序,當(dāng)DBMS經(jīng)由執(zhí)行計(jì)劃執(zhí)行查詢時(shí)DBMS 按照該順序執(zhí)行聯(lián)接運(yùn)算以從數(shù)據(jù)庫(kù)表檢索數(shù)據(jù)行并且將數(shù)據(jù)行聯(lián)接成結(jié)果集合。
通常使用嵌套循環(huán)算法來(lái)實(shí)施聯(lián)接運(yùn)算,其中將按照聯(lián)接順序來(lái)自前兩個(gè)表的所得新行與來(lái)自第三個(gè)表的所得行聯(lián)接,并且聯(lián)接這些結(jié)果與第四個(gè)表,等等。最終完成全部所需聯(lián)接運(yùn)算,并且向滿足查詢的結(jié)果集合中存儲(chǔ)所得新行。由于單個(gè)聯(lián)接限于訪問(wèn)兩個(gè)表,所以按照特定順序依次執(zhí)行多表聯(lián)接。可以通過(guò)按照若干可能聯(lián)接順序中的任何聯(lián)接順序?qū)嵤┒鄠€(gè)不同聯(lián)接查詢。例如,涉及聯(lián)接表A、B和C的查詢可以執(zhí)行為聯(lián)接表A和B, 繼而將表A與表B聯(lián)接的結(jié)果和表C進(jìn)行聯(lián)接?;蛘撸嗤樵兛梢詧?zhí)行為聯(lián)接表A和C, 繼而將表A與表C聯(lián)接的結(jié)果和表B進(jìn)行聯(lián)接。DBMS嘗試選擇如下聯(lián)接順序,該聯(lián)接順序在聯(lián)接處理中及早從潛在結(jié)果集合中消除最大數(shù)目的行,這節(jié)省了與以后在聯(lián)接運(yùn)算中重復(fù)訪問(wèn)表相關(guān)聯(lián)的成本。DBMS在嘗試為查詢確定最佳聯(lián)接順序時(shí)經(jīng)常評(píng)估關(guān)于表A、B和C的某些特性。特別地,在運(yùn)行時(shí)期間,一個(gè)聯(lián)接運(yùn)算可以具有高扇出(fan-out)速率,其中表A的每行匹配表B中的多行。如果先執(zhí)行這一聯(lián)接,則這些匹配行中的每個(gè)將需要與表C聯(lián)接,從而需要大量中間運(yùn)算。相反地,其它聯(lián)接運(yùn)算可能具有高扇入(fan-in)速率,其中表A的每行匹配表C中的很少行或者零行。如果先執(zhí)行這一聯(lián)接運(yùn)算,則僅少數(shù)行需要與表B聯(lián)接,從而節(jié)省多個(gè)中間運(yùn)算。
發(fā)明內(nèi)容
本公開(kāi)提供了方法、計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)和計(jì)算機(jī)系統(tǒng)。在一個(gè)實(shí)施例中,指明由實(shí)施查詢的第一執(zhí)行計(jì)劃指定的第一驅(qū)動(dòng)程序源,并且指明由實(shí)施查詢的第二執(zhí)行計(jì)劃指定的第二驅(qū)動(dòng)程序源。執(zhí)行第一執(zhí)行計(jì)劃的部分和第二執(zhí)行計(jì)劃的部分。如果通過(guò)執(zhí)行第一執(zhí)行計(jì)劃的該部分而返回的第一行的唯一標(biāo)識(shí)符不匹配通過(guò)執(zhí)行第二執(zhí)行計(jì)劃的該部分而向結(jié)果集合保存的來(lái)自第二驅(qū)動(dòng)程序源的所有行的所有唯一標(biāo)識(shí)符,則向結(jié)果集合添加通過(guò)執(zhí)行第一執(zhí)行計(jì)劃的該部分而返回的第一行,并且向唯一標(biāo)識(shí)符日志添加通過(guò)執(zhí)行第一執(zhí)行計(jì)劃的該部分而返回的第一行的唯一標(biāo)識(shí)符。
圖1描繪了用于實(shí)施本發(fā)明的實(shí)施例的示例系統(tǒng)的高級(jí)框圖。圖2描繪了根據(jù)本發(fā)明的實(shí)施例的示例數(shù)據(jù)庫(kù)管理系統(tǒng)的框圖。圖3描繪了根據(jù)本發(fā)明的實(shí)施例的用于數(shù)據(jù)庫(kù)的示例數(shù)據(jù)結(jié)構(gòu)的框圖。圖4描繪了根據(jù)本發(fā)明的實(shí)施例的用于唯一標(biāo)識(shí)符日志的示例數(shù)據(jù)結(jié)構(gòu)的框圖。圖5描繪了根據(jù)本發(fā)明的實(shí)施例的用于如下執(zhí)行計(jì)劃的示例數(shù)據(jù)結(jié)構(gòu)的框圖,該執(zhí)行計(jì)劃使用第一聯(lián)接順序和第一驅(qū)動(dòng)程序源實(shí)施查詢。圖6描繪了根據(jù)本發(fā)明的實(shí)施例的用于如下執(zhí)行計(jì)劃的另一示例數(shù)據(jù)結(jié)構(gòu)的框圖,該執(zhí)行計(jì)劃使用第二聯(lián)接順序和第二驅(qū)動(dòng)程序源實(shí)施查詢。圖7描繪了根據(jù)本發(fā)明的實(shí)施例的用于執(zhí)行用于查詢的執(zhí)行計(jì)劃的示例處理的流程圖。然而,應(yīng)當(dāng)注意,附圖僅圖示了本發(fā)明的示例實(shí)施例,并且因此并未被視為限制本發(fā)明其它實(shí)施例的范圍。
具體實(shí)施例方式參照附圖(其中相似標(biāo)號(hào)在若干圖中通篇表示相似部分),圖1描繪了根據(jù)本發(fā)明的實(shí)施例的經(jīng)由網(wǎng)絡(luò)130連接到客戶端計(jì)算機(jī)系統(tǒng)132的服務(wù)器計(jì)算機(jī)系統(tǒng)100的高級(jí)框圖表示。在此僅為方便起見(jiàn)而使用術(shù)語(yǔ)“服務(wù)器”和“客戶端”,并且在各種實(shí)施例中,在一個(gè)環(huán)境中作為客戶端計(jì)算機(jī)進(jìn)行操作的計(jì)算機(jī)系統(tǒng)在另一環(huán)境中可以作為服務(wù)器計(jì)算機(jī)進(jìn)行操作,反之亦然。本發(fā)明的實(shí)施例的機(jī)制和裝置同樣適用于任何適當(dāng)計(jì)算系統(tǒng)。計(jì)算機(jī)系統(tǒng)100的主要部件包括一個(gè)或者多個(gè)處理器101、主存儲(chǔ)器102、終端接口 111、存儲(chǔ)接口 112、1/0(輸入/輸出)設(shè)備接口 113和網(wǎng)絡(luò)適配器114,所有這些部件經(jīng)由存儲(chǔ)器總線103、1/0總線104和I/O總線接口單元105直接或者間接通信地耦合以用于部件間通信。計(jì)算機(jī)系統(tǒng)100包含在此通稱為處理器101的一個(gè)或者多個(gè)通用可編程中央處理器(CPU)101A、101B、101C和101D。在一個(gè)實(shí)施例中,計(jì)算機(jī)系統(tǒng)100包含通常為相對(duì)大型系統(tǒng)的多個(gè)處理器;然而,在另一實(shí)施例中,計(jì)算機(jī)系統(tǒng)100可以備選地是單個(gè)CPU系統(tǒng)。每個(gè)處理器101執(zhí)行主存儲(chǔ)器102中存儲(chǔ)的指令并且可以包括一級(jí)或者多級(jí)板上高速緩存。在一個(gè)實(shí)施例中,主存儲(chǔ)器102可以包括用于對(duì)數(shù)據(jù)和程序進(jìn)行存儲(chǔ)或者編碼的隨機(jī)存取半導(dǎo)體存儲(chǔ)器、存儲(chǔ)設(shè)備或者存儲(chǔ)介質(zhì)。在另一實(shí)施例中,主存儲(chǔ)器102代表計(jì)算機(jī)系統(tǒng)100的整個(gè)虛擬存儲(chǔ)器,并且也可以包括耦合到計(jì)算機(jī)系統(tǒng)100或者經(jīng)由網(wǎng)絡(luò)130 連接的其它計(jì)算機(jī)系統(tǒng)的虛擬存儲(chǔ)器。主存儲(chǔ)器102在概念上是單個(gè)單片實(shí)體,但是在其它實(shí)施例中,主存儲(chǔ)器102是更復(fù)雜的布置,諸如高速緩存和其它存儲(chǔ)器設(shè)備的層級(jí)。例如,存儲(chǔ)器可以存在于多級(jí)高速緩存中,并且可以按照功能進(jìn)一步劃分這些高速緩存,從而使得一個(gè)高速緩存保持指令而另一個(gè)保持由一個(gè)或者多個(gè)處理器使用的非指令數(shù)據(jù)。如在各種所謂的非統(tǒng)一存儲(chǔ)器訪問(wèn)(NUMA)計(jì)算機(jī)架構(gòu)中的任何架構(gòu)中已知的那樣,存儲(chǔ)器可以被進(jìn)一步分布并且與不同CPU或者CPU集合相關(guān)聯(lián)。主存儲(chǔ)器102對(duì)DBMS 150、結(jié)果集合152、查詢158、應(yīng)用160和UID (唯一標(biāo)識(shí)符) 日志162進(jìn)行存儲(chǔ)或者編碼。雖然DBMS 150、結(jié)果集合152、查詢158、應(yīng)用160和UID日志162被圖示為包含于計(jì)算機(jī)系統(tǒng)100中的存儲(chǔ)器102內(nèi),但是在其它實(shí)施例中,它們中的一些或者全部可以在不同計(jì)算機(jī)系統(tǒng)上并且可以例如經(jīng)由網(wǎng)絡(luò)130來(lái)遠(yuǎn)程訪問(wèn)。計(jì)算機(jī)系統(tǒng)100可以使用如下虛擬尋址機(jī)制,這些虛擬尋址機(jī)制允許計(jì)算機(jī)系統(tǒng)100的程序表現(xiàn)為如同它們僅有權(quán)訪問(wèn)大型單個(gè)存儲(chǔ)實(shí)體而不是訪問(wèn)多個(gè)較小的存儲(chǔ)實(shí)體。因此,盡管DBMS 150、結(jié)果集合152、查詢158、應(yīng)用160和UID日志162被圖示為包含于主存儲(chǔ)器102內(nèi),但是這些單元并不必須全部完全同時(shí)包含于相同存儲(chǔ)設(shè)備中。另外,雖然DBMS 150、結(jié)果集合152、查詢158、應(yīng)用160和UID日志162被圖示為單獨(dú)實(shí)體,但是在其它實(shí)施例中,它們中的一些、它們中的一些的部分或者它們?nèi)靠梢员环庋b在一起。在一個(gè)實(shí)施例中,DBMS 150和/或應(yīng)用160包括在處理器101上執(zhí)行的指令或者語(yǔ)句或者由在處理器101上執(zhí)行的指令或者語(yǔ)句解譯的指令或者語(yǔ)句,這些指令或者語(yǔ)句實(shí)現(xiàn)如下文參照?qǐng)D2、圖3、圖4、圖5、圖6和圖7進(jìn)一步描述的功能。在另一實(shí)施例中,取代或者補(bǔ)充基于處理器的系統(tǒng),經(jīng)由半導(dǎo)體器件、芯片、邏輯門(mén)、電路、電路卡和/或其它物理硬件設(shè)備采用硬件實(shí)施DBMS 150和/或應(yīng)用160。在一個(gè)實(shí)施例中,DBMS 150和/或應(yīng)用160除了指令或者語(yǔ)句之外還包括數(shù)據(jù)。在各種實(shí)施例中,應(yīng)用160是用戶應(yīng)用、第三方
6應(yīng)用、操作系統(tǒng)或者它們的任何部分、多個(gè)應(yīng)用或者組合。 存儲(chǔ)器總線103提供用于在處理器101、主存儲(chǔ)器102和I/O總線接口單元105之間傳送數(shù)據(jù)的數(shù)據(jù)通信路徑。I/O總線接口單元105還耦合到系統(tǒng)I/O總線104以用于傳送去往和來(lái)自各種/I/O單元的數(shù)據(jù)。I/O總線接口單元105通過(guò)系統(tǒng)I/O總線104與也被稱為I/O處理器(IOP)或者I/O適配器(IOA)的多個(gè)I/O接口單元111、112、113和114通I/O接口單元支持與多種存儲(chǔ)和I/O設(shè)備的通信。例如,終端接口單元111支持附接可以包括用戶輸出設(shè)備(諸如視頻顯示設(shè)備、揚(yáng)聲器和/或電視機(jī))以及用戶輸入設(shè)備 (諸如鍵盤(pán)、鼠標(biāo)、鍵區(qū)、觸板、跟蹤球、按鈕、光筆或者其它指示設(shè)備)的一個(gè)或者多個(gè)用戶 I/O設(shè)備121。用戶可以使用用戶接口來(lái)操縱用戶輸入設(shè)備,以便向用戶I/O設(shè)備121和計(jì)算機(jī)系統(tǒng)100提供輸入數(shù)據(jù)和命令,并且可以經(jīng)由用戶輸出設(shè)備接收輸出數(shù)據(jù)。例如,可以經(jīng)由用戶I/O設(shè)備121呈現(xiàn)(諸如在顯示設(shè)備上顯示、經(jīng)由揚(yáng)聲器播放或者經(jīng)由打印機(jī)打印)用戶接口。存儲(chǔ)接口單元112支持附接一個(gè)或者多個(gè)盤(pán)驅(qū)動(dòng)器或者直接存取存儲(chǔ)設(shè)備 125(這些驅(qū)動(dòng)器或者設(shè)備通常是旋轉(zhuǎn)磁盤(pán)驅(qū)動(dòng)存儲(chǔ)設(shè)備,盡管它們備選地可以是其它存儲(chǔ)設(shè)備(包括配置成在主機(jī)計(jì)算機(jī)看來(lái)表現(xiàn)為單個(gè)大型存儲(chǔ)設(shè)備的盤(pán)驅(qū)動(dòng)器陣列))。在另一實(shí)施例中,可以經(jīng)由任何類(lèi)型的輔助存儲(chǔ)設(shè)備實(shí)施存儲(chǔ)設(shè)備125。可以按照需要向存儲(chǔ)設(shè)備 125存儲(chǔ)和從存儲(chǔ)設(shè)備125檢索主存儲(chǔ)器102的內(nèi)容或者其任何部分。I/O設(shè)備接口 113 提供到各種其它輸入/輸出設(shè)備或者其它類(lèi)型的設(shè)備中的任何設(shè)備(諸如打印機(jī)或者傳真機(jī))的接口。網(wǎng)絡(luò)適配器114提供從計(jì)算機(jī)系統(tǒng)100到其它數(shù)字設(shè)備和計(jì)算機(jī)系統(tǒng)132的一個(gè)或者多個(gè)通信路徑;這樣的路徑可以包括例如一個(gè)或者多個(gè)網(wǎng)絡(luò)130。雖然在圖1中將存儲(chǔ)器總線103示出為在處理器101、主存儲(chǔ)器102和I/O總線接口 105之間提供直接通信路徑的相對(duì)簡(jiǎn)單的單總線架構(gòu),但是存儲(chǔ)器總線103實(shí)際上可以包括可以按照各種形式中的任何形式(諸如分層的點(diǎn)到點(diǎn)鏈路、星型或者網(wǎng)狀配置、多層總線、并行和冗余路徑或者任何其它適當(dāng)類(lèi)型的配置)布置的多個(gè)不同總線或者通信路徑。另外,盡管將I/O總線接口 105和I/O總線104示出為單個(gè)相應(yīng)的單元,但是計(jì)算機(jī)系統(tǒng)100實(shí)際上可以包含多個(gè)I/O總線接口單元105和/或多個(gè)I/O總線104。盡管示出了將系統(tǒng)I/O總線104與伸向各種I/O設(shè)備的各種通信路徑分離的多個(gè)I/O接口單元,但是在其它實(shí)施例中,一些或者所有I/O設(shè)備直接連接到一個(gè)或者多個(gè)系統(tǒng)I/O總線。在各種實(shí)施例中,計(jì)算機(jī)系統(tǒng)100是幾乎不具有或者完全沒(méi)有直接用戶接口、但是從其它計(jì)算機(jī)系統(tǒng)(客戶端)接收請(qǐng)求的多用戶主機(jī)計(jì)算機(jī)系統(tǒng)、單用戶系統(tǒng)或者服務(wù)器計(jì)算機(jī)或者類(lèi)似設(shè)備。在其它實(shí)施例中,計(jì)算機(jī)系統(tǒng)100被實(shí)施為臺(tái)式計(jì)算機(jī)、便攜計(jì)算機(jī)、膝上型或者筆記本計(jì)算機(jī)、平板計(jì)算機(jī)、口袋式計(jì)算機(jī)、電話、智能電話、尋呼機(jī)、汽車(chē)、 電話會(huì)議系統(tǒng)、電器或者任何其它適當(dāng)類(lèi)型的電子設(shè)備。網(wǎng)絡(luò)130可以是任何適合的網(wǎng)絡(luò)或者網(wǎng)絡(luò)的組合,并且可以支持適合于向/從計(jì)算機(jī)系統(tǒng)100和計(jì)算機(jī)系統(tǒng)132傳達(dá)數(shù)據(jù)和/或代碼的任何適當(dāng)協(xié)議。在各種實(shí)施例中, 網(wǎng)絡(luò)130可以代表直接或者間接連接到計(jì)算機(jī)系統(tǒng)100的存儲(chǔ)設(shè)備或者存儲(chǔ)設(shè)備組合。在另一實(shí)施例中,網(wǎng)絡(luò)130可以支持無(wú)線通信。在另一實(shí)施例中,網(wǎng)絡(luò)130可以支持硬接線通信,諸如電話線或者線纜。在另一實(shí)施例中,網(wǎng)絡(luò)130可以是因特網(wǎng)并且可以支持IP(網(wǎng)際協(xié)議)。在另一實(shí)施例中,網(wǎng)絡(luò)130被實(shí)施為局域網(wǎng)(LAN)或者廣域網(wǎng)(WAN)。在另一實(shí)施例中,網(wǎng)絡(luò)130被實(shí)施為熱點(diǎn)服務(wù)提供商網(wǎng)絡(luò)。在另一實(shí)施例中,網(wǎng)絡(luò)130被實(shí)施為內(nèi)部網(wǎng)。在另一實(shí)施例中,網(wǎng)絡(luò)130被實(shí)施為任何適當(dāng)蜂窩數(shù)據(jù)網(wǎng)絡(luò)、基于小區(qū)的無(wú)線電網(wǎng)絡(luò)技術(shù)或者無(wú)線網(wǎng)絡(luò)。在另一實(shí)施例中,網(wǎng)絡(luò)130被實(shí)施為任何適合的網(wǎng)絡(luò)或者網(wǎng)絡(luò)的組合。雖然示出了一個(gè)網(wǎng)絡(luò)130,但是在其它實(shí)施例中可以存在任何數(shù)目的網(wǎng)絡(luò)(類(lèi)型相同或者不同)。計(jì)算機(jī)系統(tǒng)132可以包括計(jì)算機(jī)系統(tǒng)100的一些或者所有硬件和/或計(jì)算機(jī)程序單元。圖1旨在于描繪計(jì)算機(jī)系統(tǒng)100、網(wǎng)絡(luò)130和計(jì)算機(jī)系統(tǒng)132的有代表性的主要部件。但是,個(gè)別部件可以具有比圖1中所代表的復(fù)雜性更大的復(fù)雜性,可以存在不同于或者補(bǔ)充圖1中所示部件的部件,并且這樣的部件的數(shù)目、類(lèi)型和配置可以變化。在此公開(kāi)了這樣的附加復(fù)雜性或者附加變換的若干具體示例;這些僅為舉例而并不一定僅有這樣的變換??梢圆捎枚喾N方式(包括使用各種計(jì)算機(jī)應(yīng)用、例程、部件、程序、對(duì)象、模塊、數(shù)據(jù)結(jié)構(gòu)等)實(shí)施圖1中所示的并且實(shí)施本發(fā)明的各種實(shí)施例的各種程序部件,并且下文將這些程序部件稱為“計(jì)算機(jī)程序”或者簡(jiǎn)稱為“程序”。計(jì)算機(jī)程序包括一個(gè)或者多個(gè)如下指令或者語(yǔ)句,這些指令或者語(yǔ)句在各種時(shí)間駐留于計(jì)算機(jī)系統(tǒng)100中的各種存儲(chǔ)器和存儲(chǔ)設(shè)備中,并且在由計(jì)算機(jī)系統(tǒng)100中的一個(gè)或者多個(gè)處理器讀取和執(zhí)行時(shí)或者在由一個(gè)或者多個(gè)處理器所執(zhí)行的指令解譯時(shí),使得計(jì)算機(jī)系統(tǒng)100執(zhí)行為了執(zhí)行包括本發(fā)明的實(shí)施例各種方面的步驟或者單元而必需的動(dòng)作。 本發(fā)明的實(shí)施例的方面可以具體化為系統(tǒng)、方法或者計(jì)算機(jī)程序產(chǎn)品。因而,本發(fā)明的實(shí)施例的方面可以采用全硬件實(shí)施例、全程序?qū)嵤├?包括存儲(chǔ)于存儲(chǔ)設(shè)備中的固件、駐留程序、微代碼等)或者將程序與硬件方面組合的實(shí)施例這樣的形式(在此都可以通稱為“電路”、“模塊”或者“系統(tǒng)”)。另外,本發(fā)明的實(shí)施例可以采用在一個(gè)或者多個(gè)如下計(jì)算機(jī)可讀介質(zhì)中具體化的計(jì)算機(jī)程序產(chǎn)品的形式,這些計(jì)算機(jī)可讀介質(zhì)具有具體化于其上的計(jì)算機(jī)可讀程序代碼。可以利用一個(gè)或者多個(gè)計(jì)算機(jī)可讀介質(zhì)的任何組合。計(jì)算機(jī)可讀介質(zhì)可以是計(jì)算機(jī)可讀信號(hào)介質(zhì)或者計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以例如是但不限于電子、磁、光學(xué)、電磁、紅外線或者半導(dǎo)體系統(tǒng)、裝置或者設(shè)備或者前述介質(zhì)的任何適合的組合。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)的更多具體示例(非窮舉列表)可以包括具有一個(gè)或者多個(gè)接線的電連接、便攜式計(jì)算機(jī)磁盤(pán)、硬盤(pán)(例如存儲(chǔ)設(shè)備125)、隨機(jī)存取存儲(chǔ)器(RAM)(例如存儲(chǔ)器10 、只讀存儲(chǔ)器(ROM)、可擦除可編程只讀存儲(chǔ)器(EPROM)或者閃存、光纖、便攜式緊致盤(pán)只讀存儲(chǔ)器(CD-ROM)、光學(xué)存儲(chǔ)設(shè)備、磁存儲(chǔ)設(shè)備或者前述介質(zhì)的任何適合的組合。 在本文檔的上下文中,計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以是任何如下有形介質(zhì),該有形介質(zhì)可以包含或者存儲(chǔ)用于由指令執(zhí)行系統(tǒng)、裝置或者設(shè)備使用,或者與指令執(zhí)行系統(tǒng)、裝置或者設(shè)備結(jié)合使用的程序。計(jì)算機(jī)可讀信號(hào)介質(zhì)可以包括例如在基帶中或者作為載波的一部分的具有具體化于其上的計(jì)算機(jī)可讀程序代碼的傳播數(shù)據(jù)信號(hào)。這樣的傳播信號(hào)可以采用多種形式中的任何形式(包括但不限于電磁、光學(xué)或者其任何適合的組合)。計(jì)算機(jī)可讀信號(hào)介質(zhì)可以是任何如下計(jì)算機(jī)可讀介質(zhì),該計(jì)算機(jī)可讀介質(zhì)不是計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),而是傳達(dá)、傳播或者傳送用于由指令執(zhí)行系統(tǒng)、裝置或者設(shè)備使用,或者與指令執(zhí)行系統(tǒng)、裝置或者設(shè)備結(jié)合使用的程序??梢允褂萌魏芜m當(dāng)介質(zhì)(包括但不限于無(wú)線、有線線路、光纖線纜、射頻(RF) 或者前述介質(zhì)的任何適合的組合)來(lái)發(fā)送在計(jì)算機(jī)可讀介質(zhì)上具體化的程序代碼??梢允褂靡环N或者多種編程語(yǔ)言(包括面向?qū)ο蟮木幊陶Z(yǔ)言和常規(guī)過(guò)程編程語(yǔ)言)的任何組合來(lái)編寫(xiě)用于實(shí)現(xiàn)用于本發(fā)明的實(shí)施例的方面的操作的計(jì)算機(jī)程序代碼。程序代碼可以完全在用戶的計(jì)算機(jī)上、部分在遠(yuǎn)程計(jì)算機(jī)上或者完全在遠(yuǎn)程計(jì)算機(jī)或者服務(wù)器上執(zhí)行。在后一種場(chǎng)景中,遠(yuǎn)程計(jì)算機(jī)可以通過(guò)任何類(lèi)型的網(wǎng)絡(luò)(包括局域網(wǎng)(LAN)或者廣域網(wǎng)(WAN))連接到用戶的計(jì)算機(jī),或者可以產(chǎn)生與外部計(jì)算機(jī)的連接(例如通過(guò)使用因特網(wǎng)服務(wù)提供商的因特網(wǎng))。下文參照方法、裝置(系統(tǒng))和計(jì)算機(jī)程序產(chǎn)品的流程示和/或框圖描述本發(fā)明的實(shí)施例的方面。流程示和/或框圖的每個(gè)塊,以及在流程示和/或框圖中的塊的組合,可以由在計(jì)算機(jī)可讀介質(zhì)中具體化的計(jì)算機(jī)程序指令實(shí)施??梢韵蛲ㄓ糜?jì)算機(jī)、專(zhuān)用計(jì)算機(jī)或者其它可編程數(shù)據(jù)處理裝置的處理器提供這些計(jì)算機(jī)程序指令以產(chǎn)生機(jī)器,從而使得經(jīng)由計(jì)算機(jī)或者其它可編程數(shù)據(jù)處理裝置的處理器執(zhí)行的指令產(chǎn)生用于實(shí)施流程圖和/或框圖的一個(gè)或者多個(gè)塊所指定的功能/動(dòng)作的裝置。這些計(jì)算機(jī)程序指令也可以存儲(chǔ)于如下計(jì)算機(jī)可讀介質(zhì)中,該計(jì)算機(jī)可讀介質(zhì)可以指引計(jì)算機(jī)、其它可編程數(shù)據(jù)處理裝置或者其它設(shè)備以特定方式工作,從而使得存儲(chǔ)于計(jì)算機(jī)可讀介質(zhì)中的指令產(chǎn)生包括如下指令的制造產(chǎn)品,這些指令實(shí)施由流程圖和/或框圖的一個(gè)或者多個(gè)塊所指定的功能/動(dòng)作??梢越?jīng)由可以操作地或者通信地連接(直接或者間接)到一個(gè)或者多個(gè)處理器的多種有形計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),向計(jì)算機(jī)系統(tǒng)遞送限定了本發(fā)明的各種實(shí)施例的功能的計(jì)算機(jī)程序。計(jì)算機(jī)程序指令也可以加載到計(jì)算機(jī)、其它可編程數(shù)據(jù)處理裝置或者其它設(shè)備, 以使得一系列操作步驟在計(jì)算機(jī)、其它可編程裝置或者其它設(shè)備上執(zhí)行,以產(chǎn)生計(jì)算機(jī)實(shí)施的過(guò)程,從而使得在計(jì)算機(jī)或者其它可編程裝置上執(zhí)行的指令提供用于實(shí)施在流程圖和 /或框圖的一個(gè)或者多個(gè)塊中指定的功能/動(dòng)作的過(guò)程。圖中的流程圖和框示了根據(jù)本發(fā)明的各種實(shí)施例的系統(tǒng)、方法和計(jì)算機(jī)程序產(chǎn)品的可能實(shí)施方式的架構(gòu)、功能和操作。在此方面,在流程圖或者框圖中的每個(gè)塊可以代表如下代碼模塊、段或者部分,該代碼模塊、段或者部分包括用于實(shí)施一個(gè)或者多個(gè)指定邏輯功能的一個(gè)或者多個(gè)可執(zhí)行指令。在一些實(shí)施例中,在塊中指出的功能可以不按照?qǐng)D中指出的順序出現(xiàn)。例如,根據(jù)所涉及的功能,被連續(xù)示出的兩個(gè)塊實(shí)際上可以基本上并行執(zhí)行,或者有時(shí)可以被逆序執(zhí)行??驁D和/或流程示的每個(gè)塊,以及在框圖和/或流程示中的塊的組合,可以在專(zhuān)用硬件與計(jì)算機(jī)指令的組合中,由執(zhí)行指定功能或者動(dòng)作的基于專(zhuān)用硬件的系統(tǒng)實(shí)施。本發(fā)明的實(shí)施例也可以被實(shí)現(xiàn)為與客戶公司、非盈利組織、政府實(shí)體或者內(nèi)部組織結(jié)構(gòu)的服務(wù)約定的一部分。這些實(shí)施例的方面可以包括配置計(jì)算機(jī)系統(tǒng)以執(zhí)行并且部署如下計(jì)算服務(wù)(例如計(jì)算機(jī)可讀代碼、硬件和web服務(wù)),這些計(jì)算服務(wù)實(shí)施一些或者所有在此描述的方法。這些實(shí)施例的方面也可以包括分析客戶公司、響應(yīng)于分析來(lái)產(chǎn)生推薦、生成用于實(shí)施推薦的部分的計(jì)算機(jī)可讀代碼、向現(xiàn)有過(guò)程、計(jì)算機(jī)系統(tǒng)和計(jì)算機(jī)基礎(chǔ)結(jié)構(gòu)中集成計(jì)算機(jī)可讀代碼、計(jì)量對(duì)在此描述的方法和系統(tǒng)的使用、向用戶分配開(kāi)支以及針對(duì)用戶對(duì)這些方法和系統(tǒng)的使用向用戶記賬。此外,可以基于在本發(fā)明的具體實(shí)施例中實(shí)施下文描述的各種程序的應(yīng)用來(lái)標(biāo)識(shí)這些程序。但是,僅為方便起見(jiàn)而使用以下任何特定程序術(shù)語(yǔ),因此本發(fā)明的實(shí)施例并不限于僅使用于這樣的術(shù)語(yǔ)所標(biāo)識(shí)和/或暗示的任何具體應(yīng)用。圖1中所示的示例性環(huán)境并非意在限制本發(fā)明。實(shí)際上,可以使用其它備選硬件和/ 或程序環(huán)境而不脫離本發(fā)明的實(shí)施例的范圍。圖2描繪了根據(jù)本發(fā)明的實(shí)施例的示例DBMS 150的框圖。DBMS 150包括UID日志162、解析器205、優(yōu)化器215、執(zhí)行引擎230和數(shù)據(jù)庫(kù)220。數(shù)據(jù)庫(kù)220包括表235和一個(gè)或者多個(gè)索引對(duì)0。表235以如下行和如下列、字段或者屬性的形式組織數(shù)據(jù),這些行代表各個(gè)條目、元組或者記錄,這些列、字段或者屬性限定什么內(nèi)容存儲(chǔ)于每個(gè)行、條目、元組或者記錄中。每個(gè)表235在數(shù)據(jù)庫(kù)220內(nèi)具有唯一名稱,并且每列在特定表235內(nèi)具有唯一名稱。索引240為如下數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)向DBMS 150告知在編索引的列值給定時(shí)某行在表235中的位置。DBMS 150中的解析器205從應(yīng)用160接收查詢158。解析器158請(qǐng)求DBMS 150搜索或者發(fā)現(xiàn)數(shù)據(jù)行或者行組合,并且將那些發(fā)現(xiàn)的行中符合或者滿足查詢158所指定的標(biāo)準(zhǔn)、關(guān)鍵字和/或值的數(shù)據(jù)存儲(chǔ)到結(jié)果集合152中。在一個(gè)實(shí)施例中,應(yīng)用160向DBMS 150 多次發(fā)送相同查詢158,根據(jù)DBMS 150中的數(shù)據(jù)在查詢158的出現(xiàn)之間是否已經(jīng)改變這可能會(huì)產(chǎn)生或者可能不產(chǎn)生不同的結(jié)果集合152。解析器205根據(jù)查詢158生成解析的語(yǔ)句 210,解析器205向優(yōu)化器215發(fā)送該語(yǔ)句210。優(yōu)化器215對(duì)解析的語(yǔ)句210執(zhí)行查詢優(yōu)化。作為查詢優(yōu)化的結(jié)果,優(yōu)化器215使用在數(shù)據(jù)庫(kù)220中存儲(chǔ)的諸如平臺(tái)能力、查詢內(nèi)容信息等數(shù)據(jù)來(lái)生成一個(gè)或者多個(gè)執(zhí)行計(jì)劃225。一旦生成,優(yōu)化器215就向執(zhí)行引擎230發(fā)送執(zhí)行計(jì)劃225,該執(zhí)行引擎使用執(zhí)行計(jì)劃225、索引240和UID日志162來(lái)執(zhí)行查詢158, 以便發(fā)現(xiàn)和檢索數(shù)據(jù)庫(kù)220中的數(shù)據(jù)庫(kù)表235中的滿足查詢158的標(biāo)準(zhǔn)的數(shù)據(jù)。執(zhí)行引擎 230將滿足查詢158所指定的標(biāo)準(zhǔn)的結(jié)果數(shù)據(jù)存儲(chǔ)到結(jié)果集合152中,結(jié)果集合152作為對(duì)查詢158的響應(yīng)而返回給應(yīng)用160。在一個(gè)實(shí)施例中,DBMS 150向執(zhí)行計(jì)劃225中存儲(chǔ)各種閾值。DBMS 150可以從應(yīng)用160、從用戶或者從數(shù)據(jù)庫(kù)管理員接收各種閾值,或者閾值可以由優(yōu)化器215的設(shè)計(jì)者設(shè)置。圖3描繪了根據(jù)本發(fā)明的實(shí)施例的用于數(shù)據(jù)庫(kù)220的示例數(shù)據(jù)結(jié)構(gòu)的框圖。示例數(shù)據(jù)庫(kù)220包括示例表χ 235-1、示例表y 235-2和示例表ζ 235-3。表χ 235-1包括列 χ. cl 310。表 y 2;35-2 包括列 y. cl 315 和列 y. c2 320。表 ζ 2;35_3 包括列 ζ. c2 325 和列 ζ. c3 330。列310和列315共享相同列名稱或者標(biāo)識(shí)符“cl”,而列320和列325共享相同列名稱或者標(biāo)識(shí)符“c2”。因此,在此使用符號(hào)表示χ. cl (指表X235-1中的列310)、y. cl (指表y 235-2中的列315)、y. c2 (指表y235_2中的列320),ζ. c2 (指表235-3中的列325)和 z. c3(指表235-3中的列330)來(lái)唯一地標(biāo)識(shí)列。將示例數(shù)據(jù)庫(kù)220中的每個(gè)表劃分成行和列。例如,表χ 235-1包括具有存儲(chǔ)于列x.cl 310中的“11”的第一行(11);具有存儲(chǔ)于列χ. cl 310中的“ 12”的第二行(12); 具有存儲(chǔ)于列χ. cl 310中的“3”的第三行(3)等等。表χ 235-1圖示了標(biāo)識(shí)標(biāo)中的相應(yīng)行的行標(biāo)識(shí)符(“行1”、“行2”、“行3”等)。在另一實(shí)施例中,行標(biāo)識(shí)符是標(biāo)識(shí)相應(yīng)行的存儲(chǔ)位置的地址(絕對(duì)、相對(duì)、物理、邏輯或者虛擬地址)。在一個(gè)實(shí)施例中,索引240中的地址或者標(biāo)識(shí)符指向行標(biāo)識(shí)符。在另一實(shí)施例中,行標(biāo)識(shí)符在列中是唯一值。行標(biāo)識(shí)符對(duì)于
10所有表和行而言都存在。作為另一示例,表Y 235-2包括具有存儲(chǔ)于列y. Cl 315中的“ 11 ”和存儲(chǔ)于列 y. c2 320中的“C”的第一行(11,C);具有存儲(chǔ)于列y. cl 315中的“11”和存儲(chǔ)于列y. c2 320中的“Α”的第二行(ILA);具有存儲(chǔ)于列y. cl 315中的“11”和存儲(chǔ)于列y. c2 320中的“A”的第三行(ILA)等等。作為另一示例,表ζ 235-3包括具有存儲(chǔ)于列z. c2 325中的“C”和存儲(chǔ)于列z. c3 330中的“2009”的第一行(C, 2009);具有存儲(chǔ)于列z. c2 325中的“Α”和存儲(chǔ)于列z. c3 330 中的“2010”的第二行(A,2010);具有存儲(chǔ)于列ζ. c2 325中的“Α”和存儲(chǔ)于列ζ. c3 330中的“2010”的第三行(A,2010)等等。圖4描繪了根據(jù)本發(fā)明的實(shí)施例的用于唯一標(biāo)識(shí)符日志162的示例數(shù)據(jù)結(jié)構(gòu)的框圖。在一個(gè)實(shí)施例中,UID日志162包括如下唯一標(biāo)識(shí)符,這些唯一標(biāo)識(shí)符唯一地標(biāo)識(shí)數(shù)據(jù)庫(kù)220中的來(lái)自驅(qū)動(dòng)程序源的如下行,這些行在結(jié)果集合152中并且滿足查詢158。在一個(gè)實(shí)施例中,UID日志162還包括數(shù)據(jù)庫(kù)220中的來(lái)自驅(qū)動(dòng)程序源的如下行的唯一標(biāo)識(shí)符,這些行已被執(zhí)行計(jì)劃225的執(zhí)行處理,但是由于這些行不滿足查詢158而尚未向結(jié)果集合152 添加。已處理意味著DBMS 150已經(jīng)讀取這些行、比較讀取的行與查詢158的標(biāo)準(zhǔn),并且確定這些行不滿足查詢158的標(biāo)準(zhǔn)。在各種實(shí)施例中,唯一標(biāo)識(shí)符包括行標(biāo)識(shí)符、列標(biāo)識(shí)符、 行在列中的唯一值和/或表標(biāo)識(shí)符,或者它們的任何組合或者多個(gè)標(biāo)識(shí)符。驅(qū)動(dòng)程序源是按照?qǐng)?zhí)行計(jì)劃225的聯(lián)接順序的一個(gè)指明表。在一個(gè)實(shí)施例中,DBMS 150指明驅(qū)動(dòng)程序源為按照?qǐng)?zhí)行計(jì)劃225的聯(lián)接順序的第一個(gè)表,并且實(shí)施相同查詢158的每個(gè)執(zhí)行計(jì)劃225 可以具有不同聯(lián)接順序和不同的指明驅(qū)動(dòng)程序源。在另一實(shí)施例中,實(shí)施相同查詢158的每個(gè)執(zhí)行計(jì)劃225不同、但是具有相同聯(lián)接順序。不同、但是具有相同聯(lián)接順序的執(zhí)行計(jì)劃的示例是如下執(zhí)行計(jì)劃,這些執(zhí)行計(jì)劃指定按照不同方式訪問(wèn)相同表,諸如在一個(gè)執(zhí)行計(jì)劃中掃描表的索引并且使用索引值來(lái)隨機(jī)訪問(wèn)該表,而在另一執(zhí)行計(jì)劃中掃描表(以行為序從開(kāi)頭到末尾)而不使用索引。另一示例是具有不同并行程度的執(zhí)行計(jì)劃,諸如一個(gè)執(zhí)行計(jì)劃指定使用一個(gè)任務(wù)來(lái)執(zhí)行該執(zhí)行計(jì)劃,而另一執(zhí)行計(jì)劃指定使用并行執(zhí)行的兩個(gè)任務(wù)。圖4中所示示例數(shù)據(jù)圖示了 UID日志162包括如下行的標(biāo)識(shí)符,這些行來(lái)自被不同執(zhí)行計(jì)劃標(biāo)識(shí)為驅(qū)動(dòng)程序源的不同表。因此,在一個(gè)實(shí)施例中,所有執(zhí)行計(jì)劃225的執(zhí)行讀取并且向相同UID日志162寫(xiě)入唯一標(biāo)識(shí)符。在另一實(shí)施例中,每個(gè)執(zhí)行計(jì)劃225的執(zhí)行向它自己的UID日志存儲(chǔ)唯一標(biāo)識(shí)符并且從所有其它執(zhí)行計(jì)劃225的所有UID日志讀取唯一標(biāo)識(shí)符。在一個(gè)實(shí)施例中,執(zhí)行計(jì)劃225的執(zhí)行直至DBMS 150決定開(kāi)始另一個(gè)執(zhí)行另一執(zhí)行計(jì)劃的線程才向UID日志162添加UID。一旦DBMS 150已經(jīng)決定開(kāi)始另一線程,各種實(shí)施例就包括重新掃描驅(qū)動(dòng)程序源、比較驅(qū)動(dòng)程序源中的唯一標(biāo)識(shí)符與在結(jié)果集合152中的返回行的UID并且向UID日志162添加滿足查詢158的唯一標(biāo)識(shí)符;或者重新開(kāi)始執(zhí)行原執(zhí)行計(jì)劃、繼而向UID日志162存儲(chǔ)唯一標(biāo)識(shí)符。圖5描繪了根據(jù)本發(fā)明的實(shí)施例的示例執(zhí)行計(jì)劃225-1的框圖,該示例執(zhí)行計(jì)劃 225-1使用第一聯(lián)接順序和第一驅(qū)動(dòng)程序源實(shí)施查詢。執(zhí)行計(jì)劃225-1是執(zhí)行計(jì)劃225 (圖 1)的示例并且被通稱為執(zhí)行計(jì)劃225。執(zhí)行計(jì)劃225-1包括代表如下聯(lián)接運(yùn)算的樹(shù)形圖,這些聯(lián)接運(yùn)算在執(zhí)行時(shí)實(shí)施查詢158。執(zhí)行計(jì)劃225-1的樹(shù)形圖包括聯(lián)接節(jié)點(diǎn)510和515 ; 表節(jié)點(diǎn) 520,525 和 530 ;謂詞 550,555 和 560 ;鏈接 574、576、578 和 580 ;以及鏈接 592,594 和596。表節(jié)點(diǎn)520代表表χ 235-1。表節(jié)點(diǎn)525代表表y 235-2。表節(jié)點(diǎn)530代表表ζ 235-3。執(zhí)行計(jì)劃225-1還包括驅(qū)動(dòng)程序源標(biāo)識(shí)符599,該驅(qū)動(dòng)程序源標(biāo)識(shí)符599標(biāo)識(shí)表節(jié)點(diǎn)520所代表的表為驅(qū)動(dòng)程序源。在其它實(shí)施例中,驅(qū)動(dòng)程序源標(biāo)識(shí)符599為可選的或者未被使用。例如,DBMS 150可以使用按照聯(lián)接順序的第一表節(jié)點(diǎn)所代表的表作為驅(qū)動(dòng)程序源。作為另一示例,DBMS 150可以向謂詞560添加如下子句,該子句表明為了滿足謂詞560, 來(lái)自按照聯(lián)接順序的第一個(gè)表的行的URI必須尚未存在于UID日志162中,這使得執(zhí)行計(jì)劃225的執(zhí)行不向結(jié)果集合152保存另一執(zhí)行計(jì)劃的執(zhí)行已經(jīng)向結(jié)果集合152保存的行。樹(shù)形圖由于在性質(zhì)上與具有樹(shù)枝和樹(shù)葉的層級(jí)結(jié)構(gòu)的樹(shù)相似而得名。例如,樹(shù)葉連接到小樹(shù)枝,小樹(shù)枝進(jìn)一步連接到大樹(shù)枝,并且樹(shù)的所有樹(shù)枝在樹(shù)根處具有共同起點(diǎn)。類(lèi)似地,在執(zhí)行計(jì)劃225-1的樹(shù)形圖中的節(jié)點(diǎn)510、515、520、525和530具有層級(jí)結(jié)構(gòu),因?yàn)槁?lián)接節(jié)點(diǎn)510與另一聯(lián)接節(jié)點(diǎn)515具有關(guān)系,聯(lián)接節(jié)點(diǎn)515本身可以與另一節(jié)點(diǎn)具有又一關(guān)系,以此類(lèi)推。因此,節(jié)點(diǎn)可以被劃分成最終都與根或者頭節(jié)點(diǎn)510具有關(guān)系的組和子組。 為了更正式地限定樹(shù),樹(shù)數(shù)據(jù)結(jié)構(gòu)限定節(jié)點(diǎn)的層級(jí)結(jié)構(gòu)。因此,樹(shù)是一個(gè)或者多個(gè)節(jié)點(diǎn)的有限集合T,從而使得a) —個(gè)具體指明節(jié)點(diǎn)被稱為整個(gè)樹(shù)的根;并且b)其余節(jié)點(diǎn)(除了根之外)被分割成m > = 0個(gè)不相交集合1\、. . . Tffl,并且這些集合中的每個(gè)集合又為樹(shù)。樹(shù) Tl、... Tm被稱為根的子樹(shù)。因此,樹(shù)中的每個(gè)節(jié)點(diǎn)是包含于整個(gè)樹(shù)中的一些子樹(shù)的根。節(jié)點(diǎn)的子樹(shù)數(shù)目被稱為該節(jié)點(diǎn)的度。度為零的節(jié)點(diǎn)被稱為端計(jì)算節(jié)點(diǎn)或者葉。非端節(jié)點(diǎn)被稱為分支節(jié)點(diǎn)。通過(guò)假設(shè)根節(jié)點(diǎn)具有級(jí)別0來(lái)定義節(jié)點(diǎn)相對(duì)于T的級(jí)別,并且其它節(jié)點(diǎn)具有比它們相對(duì)于包含它們的子樹(shù)具有的級(jí)別高一級(jí)的級(jí)別。每個(gè)根是它的子樹(shù)的根的父代, 后者為同胞代,并且它們也是它們的父代的子代。每個(gè)根是根的所有子樹(shù)中的所有節(jié)點(diǎn)的祖代。根節(jié)點(diǎn)的子樹(shù)中的節(jié)點(diǎn)是根的后代。整個(gè)樹(shù)的根節(jié)點(diǎn)無(wú)父節(jié)點(diǎn)。具有父節(jié)點(diǎn)和子節(jié)點(diǎn)的樹(shù)形圖僅為查詢執(zhí)行的如下邏輯表示,該邏輯表示有助于理解執(zhí)行引擎230如何執(zhí)行特定查詢158。但是,優(yōu)化器215生成的執(zhí)行計(jì)劃225可以包括執(zhí)行引擎230可理解和可執(zhí)行的代碼。這種代碼無(wú)需父節(jié)點(diǎn)和子節(jié)點(diǎn)、但是代之以包括具有這樣的節(jié)點(diǎn)和連接的樹(shù)形圖模型所代表的邏輯并且也可以被實(shí)施為其它類(lèi)型的數(shù)據(jù)結(jié)構(gòu)。因而,盡管在此使用這樣的樹(shù)形圖術(shù)語(yǔ)來(lái)描述本發(fā)明的實(shí)施例,但是無(wú)需實(shí)際創(chuàng)建和修改樹(shù)形圖。使用圖5的執(zhí)行計(jì)劃225-1的示例樹(shù),根節(jié)點(diǎn)為節(jié)點(diǎn)510。根節(jié)點(diǎn)510為它的子節(jié)點(diǎn)515和530的父代。節(jié)點(diǎn)515為它的子節(jié)點(diǎn)520和525的父代。節(jié)點(diǎn)520、525和530無(wú)子代,因而它們?yōu)槿~節(jié)點(diǎn)。節(jié)點(diǎn)520的祖代為節(jié)點(diǎn)515和510。節(jié)點(diǎn)525的祖代為節(jié)點(diǎn)515 和510。節(jié)點(diǎn)530的祖代為節(jié)點(diǎn)510。根節(jié)點(diǎn)510無(wú)祖代。鏈接574、576、578和580各自連接到、指向或者包含兩個(gè)相鄰節(jié)點(diǎn)的地址,并且允許DBMS 150發(fā)現(xiàn)父節(jié)點(diǎn)的子節(jié)點(diǎn)以及發(fā)現(xiàn)子節(jié)點(diǎn)的父節(jié)點(diǎn)。鏈接592、594和596各自連接到、指向或者包含謂詞的地址,并且允許DBMS 150發(fā)現(xiàn)節(jié)點(diǎn)的謂詞。在這一示例中,示例執(zhí)行計(jì)劃225-1實(shí)施的示例查詢158可以被表達(dá)為“從X、y、ζ選擇,其中χ. cl = y.cl并且y. c2 = ζ. c2并且ζ. c3 =年(當(dāng)前日期)-1年”。執(zhí)行計(jì)劃225-1的樹(shù)形示了用于示例性查詢158的一個(gè)示例實(shí)現(xiàn)方式和一個(gè)示例聯(lián)接順序,但是用于這一查詢158的其它實(shí)現(xiàn)方式和聯(lián)接順序也存在(包括不使用樹(shù)和不使用圖形的實(shí)施例)。每個(gè)謂詞550,555和560連接到相應(yīng)節(jié)點(diǎn)530,510和515。謂詞550,555和560 各自代表查詢158的部分并且包括如下相應(yīng)條件標(biāo)準(zhǔn)表達(dá)式,DBMS 150通過(guò)將來(lái)自從表節(jié)點(diǎn)(這些表節(jié)點(diǎn)連接到謂詞或者是連接到謂詞的聯(lián)接節(jié)點(diǎn)的子節(jié)點(diǎn))檢索的行的數(shù)據(jù)代入表達(dá)式中的與行中的列標(biāo)識(shí)符匹配的變量來(lái)將這些條件標(biāo)準(zhǔn)表達(dá)式賦值為真或者假。在各種實(shí)施例中,謂詞指定以下各項(xiàng)中的任何多項(xiàng)和/或者組合數(shù)據(jù);列、字段或者關(guān)鍵字;函數(shù)、調(diào)用(call)、引用(invocation)、方法、類(lèi)或者小程序;關(guān)系運(yùn)算符(例如大于、小于、 等于、不等于、大于等于、小于等于或者任何其它關(guān)系運(yùn)算符);邏輯運(yùn)算符(例如AND、OR、 M)R、N0T、N0R、NAND或者任何其它邏輯運(yùn)算符);算術(shù)運(yùn)算符(例如乘法、除法、加法、減法、 基數(shù)、冪、對(duì)數(shù)或者任何其它算術(shù)運(yùn)算符);以及寄存器運(yùn)算(例如左移、右移運(yùn)算或者任何其它寄存器運(yùn)算);并且關(guān)系運(yùn)算符、邏輯運(yùn)算符、算術(shù)運(yùn)算符和寄存器運(yùn)算可以具有任何數(shù)目的自變量或者運(yùn)算數(shù)(例如它們可以是一進(jìn)制、二進(jìn)制、三進(jìn)制或者η進(jìn)制)。DBMS 150讀取聯(lián)接節(jié)點(diǎn),并且作為響應(yīng)從聯(lián)接節(jié)點(diǎn)的一個(gè)或者多個(gè)子表節(jié)點(diǎn)讀取行、代入讀取的行中的來(lái)自列(這些列具有與在連接到聯(lián)接節(jié)點(diǎn)的謂詞中指定的表和列標(biāo)識(shí)符相同的表和列標(biāo)識(shí)符)的數(shù)據(jù),并且將所得謂詞表達(dá)式賦值為真或者假。如果謂詞表達(dá)式賦值為真,則讀取的行滿足或者符合連接的謂詞,因而如果來(lái)自驅(qū)動(dòng)程序源的行的唯一標(biāo)識(shí)符尚未在UID日志162中,則DBMS 150向結(jié)果集合152保存讀取的行。如果來(lái)自驅(qū)動(dòng)程序源的唯一標(biāo)識(shí)符已經(jīng)在UID日志162中,則DBMS 150不向結(jié)果集合152添加行。如果謂詞表達(dá)式賦值為假,則讀取的行不滿足或者符合謂詞,因而DBMS 150從結(jié)果集合152 排除讀取的行。聯(lián)接節(jié)點(diǎn)代表如下表的聯(lián)接運(yùn)算,這些表的行滿足連接的謂詞。在各種實(shí)施例中, 聯(lián)接運(yùn)算可以包括內(nèi)聯(lián)接、相等聯(lián)接、自然聯(lián)接、外聯(lián)接、左外聯(lián)接、右外聯(lián)接、全外聯(lián)接、例外聯(lián)接和自連接。在兩個(gè)表之間的內(nèi)聯(lián)接造成在結(jié)果集合152中僅返回與某些選擇標(biāo)準(zhǔn)匹配的行。外聯(lián)接(諸如表A和表B的(根據(jù)一組選擇標(biāo)準(zhǔn)的)左聯(lián)接)返回所有匹配行以及表A中的在表B中無(wú)匹配的那些行。匹配行讓它們的所有字段的值由來(lái)自表A和表B的數(shù)據(jù)填充。但是,來(lái)自表A的非匹配行將在來(lái)自表B的字段中具有空值或者其它默認(rèn)字符。 另一外聯(lián)接(諸如表A和表B的右聯(lián)接)也返回所有匹配行,但是與左聯(lián)接不同,其返回表 B中的在表A中無(wú)匹配的那些行。表A和表B的例外聯(lián)接返回表A中的在表B中不存在匹配行的那些行的結(jié)果集合152。聯(lián)接節(jié)點(diǎn)515代表使用連接的謂詞560對(duì)子表節(jié)點(diǎn)520和525代表的表的聯(lián)接運(yùn)算。聯(lián)接節(jié)點(diǎn)510代表如下聯(lián)接運(yùn)算,該聯(lián)接運(yùn)算使用對(duì)聯(lián)接節(jié)點(diǎn)515的聯(lián)接運(yùn)算所返回的中間結(jié)果集合和子表節(jié)點(diǎn)530使用謂詞550來(lái)創(chuàng)建的另一中間結(jié)果的謂詞555。在一個(gè)實(shí)施例中,聯(lián)接節(jié)點(diǎn)代表DBMS 150中的如下邏輯,該邏輯執(zhí)行如下聯(lián)接運(yùn)算,該聯(lián)接運(yùn)算發(fā)現(xiàn)子表節(jié)點(diǎn)中的如下行,這些行的列值在聯(lián)接節(jié)點(diǎn)的邏輯將發(fā)現(xiàn)的行的列值帶入如下謂詞中的占位符或者變量時(shí)滿足謂詞的標(biāo)準(zhǔn),這些謂詞具有與行中的列標(biāo)識(shí)符相同的名稱或者標(biāo)識(shí)符。在操作中,DBMS 150使用執(zhí)行計(jì)劃225-1來(lái)執(zhí)行查詢158如下。DBMS 150在根或者頭節(jié)點(diǎn)開(kāi)始遍歷節(jié)點(diǎn)并且遇見(jiàn)(讀取)頭聯(lián)接節(jié)點(diǎn)510。由于聯(lián)接節(jié)點(diǎn)510并非表節(jié)點(diǎn),所以DBMS 150在搜索第一行時(shí)經(jīng)由鏈接574向聯(lián)接節(jié)點(diǎn)510的左子聯(lián)接節(jié)點(diǎn)515行進(jìn)。DBMS 150繼而遇見(jiàn)(讀取)聯(lián)接節(jié)點(diǎn)515。由于聯(lián)接節(jié)點(diǎn)515并非表節(jié)點(diǎn),所以DBMS 150 在搜索第一行時(shí)再次經(jīng)由鏈接578向節(jié)點(diǎn)515的左子節(jié)點(diǎn)520行進(jìn)。DBMS 150繼而遇見(jiàn)表節(jié)點(diǎn)520并且使用掃描操作從表節(jié)點(diǎn)520代表的表檢索第一行。在掃描操作中,DBMS 150 從表的開(kāi)頭到末尾讀取行而不使用索引240來(lái)隨機(jī)訪問(wèn)表。DBMS 150繼而向節(jié)點(diǎn)515的右子節(jié)點(diǎn)525行進(jìn),遇見(jiàn)(讀取)表節(jié)點(diǎn)525,并且在表節(jié)點(diǎn)225標(biāo)識(shí)的表中搜索滿足聯(lián)接節(jié)點(diǎn)515的連接謂詞560的選擇標(biāo)準(zhǔn)的第二行。如果 DBMS 150在表節(jié)點(diǎn)525標(biāo)識(shí)的表中未發(fā)現(xiàn)滿足聯(lián)接節(jié)點(diǎn)515的連接謂詞560的選擇標(biāo)準(zhǔn)的第二行,則DBMS 150返回到表節(jié)點(diǎn)520并且在表χ中掃描下一行而且返回到表節(jié)點(diǎn)525 并且再次在表節(jié)點(diǎn)525標(biāo)識(shí)的表y中搜索滿足聯(lián)接節(jié)點(diǎn)515的謂詞560的選擇標(biāo)準(zhǔn)的第二行。一旦標(biāo)識(shí)了在表節(jié)點(diǎn)525標(biāo)識(shí)的表中的如下匹配行(該匹配行滿足謂詞560的選擇標(biāo)準(zhǔn)),DBMS 150就在中間結(jié)果集合中向聯(lián)接節(jié)點(diǎn)510返回發(fā)現(xiàn)的第一行(在掃描操作中從節(jié)點(diǎn)520表示的表讀取)和第二行(從表節(jié)點(diǎn)525讀取)。DBMS 150繼而向右子表節(jié)點(diǎn)530行進(jìn)并且在表節(jié)點(diǎn)530標(biāo)識(shí)的表ζ中搜索滿足或者符合謂詞550和555的第三行。 注意,在確定表Z中的行是否滿足謂詞555時(shí),DBMS 150使用在表節(jié)點(diǎn)525中發(fā)現(xiàn)的并且在中間結(jié)果集合中返回的第二行,以便比較y.c2 = z.c2。如果DBMS 150針對(duì)從聯(lián)接節(jié)點(diǎn) 515返回的中間結(jié)果集合在表530中未發(fā)現(xiàn)滿足謂詞550和555的行,則DBMS 150在返回到聯(lián)接節(jié)點(diǎn)510并且再次在表ζ (表節(jié)點(diǎn)530)中搜索滿足謂詞550和555的第三行之前,返回到聯(lián)接節(jié)點(diǎn)515并且重新執(zhí)行聯(lián)接,從而檢索表x(表節(jié)點(diǎn)520)的下一行并且在表y(表節(jié)點(diǎn)525)中發(fā)現(xiàn)滿足謂詞560的行。一旦DBMS 150已經(jīng)在表ζ (表節(jié)點(diǎn)530)中發(fā)現(xiàn)滿足謂詞550和555的標(biāo)準(zhǔn)的第三行,DBMS 150就向聯(lián)接節(jié)點(diǎn)510返回滿足謂詞550、555和560的標(biāo)準(zhǔn)的來(lái)自表χ的第一行、來(lái)自表y的第二行和來(lái)自表ζ的第三行的中間結(jié)果集合。如前文參照?qǐng)D4描述的那樣, DBMS 150繼而向結(jié)果集合152添加滿足謂詞的行并且添加標(biāo)識(shí)來(lái)自驅(qū)動(dòng)程序源的行的唯一標(biāo)識(shí)符。一旦DBMS 150在聯(lián)接節(jié)點(diǎn)510掃描了表ζ中的所有行并且處理了任何匹配,DBMS 150就檢索表χ的下一行并且重復(fù)前述操作序列。因此,代表表χ 235-1的表節(jié)點(diǎn)520是按照?qǐng)?zhí)行計(jì)劃225-1的聯(lián)接順序的第一個(gè)表,因?yàn)镈BMS 150在按照聯(lián)接順序從任何其它表(由節(jié)點(diǎn)525和530代表)讀取行之前掃描來(lái)自表χ 235-1的行。DBMS 150指明表節(jié)點(diǎn)520所代表的表χ 235-1為用于執(zhí)行計(jì)劃225-1的驅(qū)動(dòng)程序源,因?yàn)楸砉?jié)點(diǎn)520在聯(lián)接順序中是第一個(gè)。在另一實(shí)施例中,DBMS 150指明任何適當(dāng)表為驅(qū)動(dòng)程序源。節(jié)點(diǎn)525代表的表y 235-2在聯(lián)接順序中是第二個(gè),因?yàn)镈BMS 150在從表χ讀取行以便確定是否滿足謂詞560之后并且在從表節(jié)點(diǎn)530代表的表ζ 235-3讀取行之前從表y 235-2讀取行。表節(jié)點(diǎn)530代表的表ζ 235-3在聯(lián)接順序中是第三個(gè)或者最后一個(gè),因?yàn)镈BMS 150在從表χ 235-1和表y 235-2讀取行以便確定是否滿足謂詞550和555之后從表ζ 235-3讀取行。圖6描繪了根據(jù)本發(fā)明的實(shí)施例的另一示例執(zhí)行計(jì)劃225-2的框圖,該執(zhí)行計(jì)劃使用第二聯(lián)接順序和第二驅(qū)動(dòng)程序源來(lái)實(shí)施查詢158。在這一示例中,執(zhí)行計(jì)劃225-2實(shí)施的查詢158與執(zhí)行計(jì)劃225-1 (圖幻實(shí)施的查詢158相同,但是執(zhí)行計(jì)劃225-2具有與執(zhí)行計(jì)劃225-1不同的聯(lián)接順序和不同的驅(qū)動(dòng)程序源。
執(zhí)行計(jì)劃225-2是執(zhí)行計(jì)劃225 (圖1)的示例。執(zhí)行計(jì)劃225_2包括代表如下聯(lián)接運(yùn)算的樹(shù)形圖,這些聯(lián)接運(yùn)算在執(zhí)行時(shí)實(shí)施查詢158。執(zhí)行計(jì)劃225-2的樹(shù)形圖包括聯(lián)接節(jié)點(diǎn) 610 和 615 ;表節(jié)點(diǎn) 620,625 和 630 ;謂詞 650,655 和 660 ;鏈接 674、676、678 和 680 ; 以及鏈接692、694和696。表節(jié)點(diǎn)620代表表ζ 235-3。表節(jié)點(diǎn)625代表表y 235-2。表節(jié)點(diǎn)630代表表χ 235-1。執(zhí)行計(jì)劃225-2還包括驅(qū)動(dòng)程序源標(biāo)識(shí)符699,驅(qū)動(dòng)程序源標(biāo)識(shí)符 699將表節(jié)點(diǎn)620所代表的表標(biāo)識(shí)為驅(qū)動(dòng)程序源。在其它實(shí)施例中,驅(qū)動(dòng)程序源標(biāo)識(shí)符699 為可選的或者未被使用。在執(zhí)行計(jì)劃225-2中,表節(jié)點(diǎn)620在聯(lián)接順序中是第一個(gè),表節(jié)點(diǎn) 625在聯(lián)接順序中是第二個(gè),而表節(jié)點(diǎn)630在聯(lián)接順序中是第三個(gè)和最后一個(gè)。分別使用圖2中所示數(shù)據(jù)庫(kù)220中的示例數(shù)據(jù)和示例執(zhí)行計(jì)劃225-1,DBMS 150 向結(jié)果集合152返回如下行,該行包括來(lái)自表χ 235-1、表y 235-2和表ζ 235-3中的每個(gè)表的“行1”。由于執(zhí)行計(jì)劃225-1中的驅(qū)動(dòng)程序源是表節(jié)點(diǎn)520,所以DBMS 150向UID日志162存儲(chǔ)表χ的行1的指示。DBMS 150繼而從表ζ 235-3讀取“行6”、但是丟棄這一行并且不向結(jié)果集合152添加它,因?yàn)殡m然滿足謂詞555(表y 235-2的“行1”中的y. c2 BP"C ”等于表ζ 253-3的“行6”中的z. c2即“C”),但是如果當(dāng)年為2010年則z. c3即“2010” 不滿足謂詞550。DBMS 150繼而讀取并且最終丟棄表y 235-3的“行2”,因?yàn)樵诒恙?235-3 中的“行2” (該行在列z. c2 325中包含與y. c2 320中的值“Α”匹配的值“Α”從而滿足謂詞555)包含z. c3 330即“2010”中的值“2010”,這不滿足謂詞550。DBMS 150繼而讀取并且出于相同原因而最終丟棄表y 235-2的“行3”和“行4”。這種讀取滿足按照聯(lián)接順序的較早的謂詞的行、但是由于不滿足按照聯(lián)接順序的較晚的謂詞而最終丟棄行稱為饑餓聯(lián)接(starvation join)。在這一示例中,DBMS 150檢測(cè)饑餓聯(lián)接的出現(xiàn),并且作為響應(yīng)而創(chuàng)建具有不同聯(lián)接順序和不同驅(qū)動(dòng)程序源的另一執(zhí)行計(jì)劃225-2,并且與執(zhí)行計(jì)劃225-1的執(zhí)行并行開(kāi)始執(zhí)行計(jì)劃225-2的執(zhí)行。執(zhí)行計(jì)劃225-2 的執(zhí)行發(fā)現(xiàn)執(zhí)行計(jì)劃225-1先前發(fā)現(xiàn)的滿足謂詞650、655和660的來(lái)自每個(gè)表的相同“行 1”,但是執(zhí)行計(jì)劃225-2的執(zhí)行由于已經(jīng)在UID日志162中標(biāo)識(shí)了表χ的“行1”而丟棄來(lái)自每個(gè)表的“行1”并且不向結(jié)果集合152添加它們。執(zhí)行計(jì)劃225-2的執(zhí)行繼而繼續(xù)掃描表ζ 235-3(由按照聯(lián)接順序的第一個(gè)表節(jié)點(diǎn)的表節(jié)點(diǎn)620標(biāo)識(shí))并且丟棄不符合謂詞650 的“行2”、“行3”和“行4”。執(zhí)行計(jì)劃225-2的執(zhí)行繼而繼續(xù)掃描表ζ 235-3并且發(fā)現(xiàn)滿足謂詞650的“行5”。執(zhí)行計(jì)劃225-2的執(zhí)行繼而在表y 235-2中發(fā)現(xiàn)滿足謂詞660的“行 6”(表y 235-2的y. c2 320中的“B”匹配表ζ 235-3的行5的z. c2 325中的“B”),以及在表χ 235-1中滿足謂詞655的“行3”(表y 235-2中的y.cl 315的“行6”中的“3”匹配表χ 2;35-1中的x.cl 310的“行3”中的“3”)。由于表ζ 2;35_3中的“行5”的UID未存在于UID日志162中,所以執(zhí)行計(jì)劃225-2的執(zhí)行向UID日志162添加表ζ 235-3中的 “行5”的UID并且向結(jié)果集合152添加返回的行。因此,在一個(gè)實(shí)施例中,DBMS 150可以檢測(cè)饑餓聯(lián)接并且開(kāi)始另一執(zhí)行計(jì)劃(在這一示例中為執(zhí)行計(jì)劃225- 的執(zhí)行,該執(zhí)行計(jì)劃可以比原執(zhí)行計(jì)劃(在這一示例中為執(zhí)行計(jì)劃225-1)更快完成查詢158而又仍然使用原執(zhí)行計(jì)劃(執(zhí)行計(jì)劃225-1)的返回行。圖7描繪了根據(jù)本發(fā)明的實(shí)施例的用于執(zhí)行用于查詢的執(zhí)行計(jì)劃的示例處理的流程圖。圖7代表的邏輯是重新進(jìn)入并且可以在相同或者不同處理器上由多個(gè)線程并行執(zhí)行、基本上并行執(zhí)行或者交織,從而經(jīng)由多線程、多任務(wù)、多編程或者多處理技術(shù)創(chuàng)建并且執(zhí)行不同執(zhí)行計(jì)劃。在另一實(shí)施例中,可以依次執(zhí)行不同執(zhí)行計(jì)劃??刂圃趬K700處開(kāi)始。 控制繼而繼續(xù)塊705,其中DBMS 150創(chuàng)建實(shí)施查詢158的執(zhí)行計(jì)劃(諸如執(zhí)行計(jì)劃225-1 或者225- 。DBMS 150選擇和指明執(zhí)行計(jì)劃中的驅(qū)動(dòng)程序源??刂评^而繼續(xù)塊710,其中DBMS 150執(zhí)行該執(zhí)行計(jì)劃的當(dāng)前部分從而返回行。如果行的UID已經(jīng)存在于UID日志162中,則DBMS 150不向結(jié)果集合152添加那些行并且不向UID日志162添加UID。如果行的UID尚未存在于UID日志162中,則DBMS 150向結(jié)果集合152添加尚未存在的行、向UID日志162添加尚未存在于UID日志162中的驅(qū)動(dòng)程序源行的UID,并且向請(qǐng)求查詢158的用戶或者應(yīng)用返回結(jié)果集合152、保存結(jié)果集合152和 /或經(jīng)由用戶I/O設(shè)備121顯示結(jié)果集合152。控制繼而繼續(xù)塊715,其中DBMS 150確定實(shí)施查詢158的任何執(zhí)行計(jì)劃(無(wú)論是由當(dāng)前線程還是任何其它線程執(zhí)行)的執(zhí)行是否完成。如果在塊715處的確定為真,則實(shí)施查詢158的任何執(zhí)行計(jì)劃的執(zhí)行完成,并且已經(jīng)發(fā)現(xiàn)滿足查詢158的所有行,因而控制繼續(xù)塊799,其中圖7的當(dāng)前線程結(jié)束或者返回到調(diào)用程序。如果在塊715處的確定為假,則實(shí)施查詢158的任何執(zhí)行計(jì)劃的執(zhí)行未完成,并且尚未發(fā)現(xiàn)滿足查詢158的所有行,因而控制繼續(xù)塊725,其中DBMS 150確定由執(zhí)行計(jì)劃的執(zhí)行向結(jié)果集合152添加行的速率是否大于比由次快執(zhí)行計(jì)劃的執(zhí)行向結(jié)果集合152添加行的速率更慢的閾值。如果在塊725處的確定為真,則執(zhí)行計(jì)劃的執(zhí)行向結(jié)果集合152添加行的速率大于比次快執(zhí)行計(jì)劃的執(zhí)行向結(jié)果集合152添加行的速率更慢的閾值,因而控制繼續(xù)塊799, 其中圖7的邏輯返回,這意味著當(dāng)前線程停止執(zhí)行當(dāng)前執(zhí)行計(jì)劃,但是實(shí)施相同查詢的其它執(zhí)行計(jì)劃繼續(xù)執(zhí)行而不受影響。如果在塊725處的確定為假,則執(zhí)行計(jì)劃的執(zhí)行向結(jié)果集合152添加行的速率未大于比次快執(zhí)行計(jì)劃的執(zhí)行向結(jié)果集合152添加行的速率更慢的閾值,因而控制繼續(xù)塊 730,其中DBMS 150確定第一個(gè)表和第二個(gè)表的相繼聯(lián)接(按照聯(lián)接順序相繼而無(wú)居間聯(lián)接)從結(jié)果集合消除的行的比例是否大于饑餓閾值。聯(lián)接運(yùn)算通過(guò)從結(jié)果集合152去除或者刪除不滿足如下謂詞的行來(lái)消除行,該謂詞連接到代表聯(lián)接運(yùn)算的聯(lián)接節(jié)點(diǎn)。如果比例大于饑餓閾值,則DBMS已經(jīng)標(biāo)識(shí)饑餓聯(lián)接條件,其中來(lái)自按照聯(lián)接順序較晚的表(按照相繼聯(lián)接的聯(lián)接順序比第一個(gè)表更晚的第二個(gè)表)的行的聯(lián)接從結(jié)果集合中消除大量行。如果在塊730處的確定為真,則第一個(gè)表和第二個(gè)表的相繼聯(lián)接從結(jié)果集合消除的行的比例大于饑餓閾值,因而控制繼續(xù)塊735,其中DBMS 150創(chuàng)建執(zhí)行圖7的邏輯的另一線程并且開(kāi)始另一線程在處理器上執(zhí)行。新創(chuàng)建的線程創(chuàng)建并且執(zhí)行具有與圖7的當(dāng)前實(shí)例執(zhí)行的執(zhí)行計(jì)劃不同的聯(lián)接順序。在另一實(shí)施例中,新創(chuàng)建的線程創(chuàng)建并且執(zhí)行具有與圖7的當(dāng)前實(shí)例執(zhí)行的執(zhí)行計(jì)劃相同的聯(lián)接順序、但是與該執(zhí)行計(jì)劃不同的另一執(zhí)行計(jì)劃。新創(chuàng)建的線程向相同結(jié)果集合152保存行,并且使用與當(dāng)前線程相同的UID日志162, 控制繼而繼續(xù)塊740,其中DBMS 150將待執(zhí)行的用于執(zhí)行計(jì)劃的當(dāng)前部分設(shè)置為用于執(zhí)行計(jì)劃的下一未執(zhí)行部分??刂评^而返回到塊710,其中DBMS 150如上文先前描述的那樣執(zhí)行該執(zhí)行計(jì)劃的下一當(dāng)前部分。在另一實(shí)施例中,如果處理UID、但是未向結(jié)果集合152添加UID標(biāo)識(shí)的行,則 DBMS 150向UID日志162添加UID,從而使得另一執(zhí)行計(jì)劃的執(zhí)行無(wú)需考慮UID。在一個(gè)
16實(shí)施例中,DBMS 150在處理行之前而不是在處理行之后檢查UID日志162。如在此所使用的,已處理、但是未向結(jié)果集合152添加的行意味著已經(jīng)從表讀取、但是被丟棄而未向結(jié)果集合152添加的行。如果在塊730處的確定為假,則第一個(gè)表和第二個(gè)表的相繼聯(lián)接從結(jié)果集合消除的行的比例未大于饑餓閾值,因而控制繼續(xù)塊740,其中DBMS 150將待執(zhí)行的執(zhí)行計(jì)劃的當(dāng)前部分設(shè)置為執(zhí)行計(jì)劃的下一未執(zhí)行部分而不創(chuàng)建新線程??刂评^而返回到塊710,其中 DBMS 150如上文先前描述的那樣執(zhí)行該執(zhí)行計(jì)劃的下一當(dāng)前部分。因此,在一個(gè)實(shí)施例中,如果尚未通過(guò)執(zhí)行任何其它執(zhí)行計(jì)劃來(lái)向結(jié)果集合添加行,則通過(guò)執(zhí)行一個(gè)執(zhí)行計(jì)劃來(lái)向結(jié)果集合存儲(chǔ)該行,因而通過(guò)執(zhí)行所有不同執(zhí)行計(jì)劃來(lái)向結(jié)果集合添加的行的交集為空集。按照這種方式,在一個(gè)實(shí)施例中,比僅執(zhí)行一個(gè)執(zhí)行計(jì)劃提供更佳性能。在此所使用的術(shù)語(yǔ)僅出于描述具體實(shí)施例的目的而并非意在限制本發(fā)明。如在此所使用的,除非上下文另有清楚指示,單數(shù)形式“一個(gè)/ 一種”和“該”意在于也包括復(fù)數(shù)形式。還應(yīng)當(dāng)理解,術(shù)語(yǔ)“包括”在使用于本說(shuō)明書(shū)中時(shí)指定存在記載的特征、整體、步驟、 操作、單元和/或部件,但是并未排除存在或者添加一個(gè)或者多個(gè)其它特征、整體、步驟、操作、單元、部件和/或其分組。在對(duì)本發(fā)明的示例性實(shí)施例的先前具體描述中,參照如下附圖(其中相似標(biāo)號(hào)代表相似單元),這些附圖形成該描述的一部分,并且在附圖中通過(guò)示例來(lái)示出可以對(duì)本發(fā)明進(jìn)行實(shí)現(xiàn)的具體示例性實(shí)施例。采用充分細(xì)節(jié)描述這些實(shí)施例以使得本領(lǐng)域技術(shù)人員能夠?qū)崿F(xiàn)本發(fā)明,但是可以利用其它實(shí)施例并且可以進(jìn)行邏輯、機(jī)械、電性和其它改變而不脫離本發(fā)明的范圍。在前文描述中,闡述了諸多具體細(xì)節(jié)以提供對(duì)本發(fā)明的實(shí)施例的透徹理解。但是,沒(méi)有這些具體細(xì)節(jié)仍然可以實(shí)現(xiàn)本發(fā)明的實(shí)施例。在其它實(shí)例中,沒(méi)有詳細(xì)示出公知電路、結(jié)構(gòu)和技術(shù)以免使本發(fā)明的實(shí)施例難以理解。如在本說(shuō)明書(shū)內(nèi)使用的詞匯“實(shí)施例”的不同實(shí)例并不必須指代相同實(shí)施例,但是它們可以指代相同實(shí)施例。在此圖示或者描述的任何數(shù)據(jù)和數(shù)據(jù)結(jié)構(gòu)僅為示例,并且在其它實(shí)施例中,可以使用不同數(shù)據(jù)量、數(shù)據(jù)類(lèi)型、字段、字段數(shù)目和類(lèi)型、字段名稱、行數(shù)目和類(lèi)型、記錄、條目或者數(shù)據(jù)組織。此外,任何數(shù)據(jù)可以與邏輯組合,從而使得單獨(dú)數(shù)據(jù)結(jié)構(gòu)并非必需。前文具體描述因此將不被理解成限制意義。
權(quán)利要求
1.一種方法,包括指明由實(shí)施查詢的第一執(zhí)行計(jì)劃指定的第一驅(qū)動(dòng)程序源;指明由實(shí)施所述查詢的第二執(zhí)行計(jì)劃指定的第二驅(qū)動(dòng)程序源;執(zhí)行所述第一執(zhí)行計(jì)劃的部分;執(zhí)行所述第二執(zhí)行計(jì)劃的部分;以及如果通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分所返回的第一行的唯一標(biāo)識(shí)符不匹配通過(guò)所述執(zhí)行所述第二執(zhí)行計(jì)劃的所述部分向結(jié)果集合保存的來(lái)自所述第二驅(qū)動(dòng)程序源的所有行的所有唯一標(biāo)識(shí)符,則向所述結(jié)果集合添加通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分所返回的所述第一行,并且向唯一標(biāo)識(shí)符日志添加通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分所返回的所述第一行的所述唯一標(biāo)識(shí)符。
2.根據(jù)權(quán)利要求1所述的方法,還包括如果通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃所返回的所述第一行的所述唯一標(biāo)識(shí)符匹配通過(guò)所述執(zhí)行所述第二執(zhí)行計(jì)劃向所述結(jié)果集合保存的來(lái)自所述第二驅(qū)動(dòng)程序源的行的唯一標(biāo)識(shí)符,則阻止向所述結(jié)果集合添加通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述第一行,并且阻止向所述唯一標(biāo)識(shí)符日志添加通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃所返回的所述第一行的所述唯一標(biāo)識(shí)符。
3.根據(jù)權(quán)利要求1所述的方法,其中所述第一執(zhí)行計(jì)劃不同于所述第二執(zhí)行計(jì)劃,并且所述第一驅(qū)動(dòng)程序源不同于所述第二驅(qū)動(dòng)程序源。
4.根據(jù)權(quán)利要求1所述的方法,其中所述第一執(zhí)行計(jì)劃包括第一聯(lián)接順序并且所述第二執(zhí)行計(jì)劃包括第二聯(lián)接順序,其中所述第一聯(lián)接順序不同于所述第二聯(lián)接順序,并且其中所述執(zhí)行所述第二執(zhí)行計(jì)劃的所述部分與所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分并行執(zhí)行。
5.根據(jù)權(quán)利要求1所述的方法,其中所述第一執(zhí)行計(jì)劃包括多個(gè)表的聯(lián)接順序并且所述第二執(zhí)行計(jì)劃包括所述多個(gè)表的所述聯(lián)接順序,并且其中所述第一執(zhí)行計(jì)劃指定掃描所述多個(gè)表中的一個(gè)表的索引并且所述第二執(zhí)行計(jì)劃指定掃描所述多個(gè)表中的所述一個(gè)表而不使用所述索引。
6.根據(jù)權(quán)利要求1所述的方法,還包括通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分向所述結(jié)果集合存儲(chǔ)第一多行;并且通過(guò)所述執(zhí)行所述第二執(zhí)行計(jì)劃的所述部分向所述結(jié)果集合存儲(chǔ)第二多行,其中所述第一多行和所述第二多行的交集為空集。
7.根據(jù)權(quán)利要求6所述的方法,還包括如果所述通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分向所述結(jié)果集合存儲(chǔ)所述第一多行的速率大于比通過(guò)所述執(zhí)行所述第二執(zhí)行計(jì)劃的所述部分向所述結(jié)果集合存儲(chǔ)所述第二多行的速率更慢的閾值,則中止所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分。
8.一種計(jì)算機(jī)系統(tǒng),包括處理器;以及存儲(chǔ)器,其通信地耦合到所述處理器,其中所述存儲(chǔ)器使用指令來(lái)編碼,其中所述指令在由所述處理器執(zhí)行時(shí)包括指明由實(shí)施查詢的第一執(zhí)行計(jì)劃指定的第一驅(qū)動(dòng)程序源;指明由實(shí)施所述查詢的第二執(zhí)行計(jì)劃指定的第二驅(qū)動(dòng)程序源;執(zhí)行所述第一執(zhí)行計(jì)劃的部分;執(zhí)行所述第二執(zhí)行計(jì)劃的部分;如果通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分所返回的第一行的唯一標(biāo)識(shí)符不匹配通過(guò)所述執(zhí)行所述第二執(zhí)行計(jì)劃的所述部分向結(jié)果集合保存的來(lái)自所述第二驅(qū)動(dòng)程序源的所有行的所有唯一標(biāo)識(shí)符,則向所述結(jié)果集合添加通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分所返回的所述第一行,并且向唯一標(biāo)識(shí)符日志添加通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分所返回的所述第一行的所述唯一標(biāo)識(shí)符,并且如果通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃所返回的所述第一行的所述唯一標(biāo)識(shí)符匹配通過(guò)所述執(zhí)行所述第二執(zhí)行計(jì)劃向所述結(jié)果集合保存的來(lái)自所述第二驅(qū)動(dòng)程序源< >的行的唯一標(biāo)識(shí)符,則阻止向所述結(jié)果集合添加通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述第一行,并且阻止向所述唯一標(biāo)識(shí)符日志添加通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃所返回的所述第一行的所述唯一標(biāo)識(shí)符。
9.根據(jù)權(quán)利要求8所述的計(jì)算機(jī)系統(tǒng),其中所述第一執(zhí)行計(jì)劃不同于所述第二執(zhí)行計(jì)劃,并且所述第一驅(qū)動(dòng)程序源不同于所述第二驅(qū)動(dòng)程序源。
10.根據(jù)權(quán)利要求8所述的計(jì)算機(jī)系統(tǒng),其中所述第一執(zhí)行計(jì)劃包括第一聯(lián)接順序并且所述第二執(zhí)行計(jì)劃包括第二聯(lián)接順序,其中所述第一聯(lián)接順序不同于所述第二聯(lián)接順序,并且其中所述執(zhí)行所述第二執(zhí)行計(jì)劃的所述部分與所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分并行執(zhí)行。
11.根據(jù)權(quán)利要求8所述的方法,其中所述第一執(zhí)行計(jì)劃包括多個(gè)表的聯(lián)接順序并且所述第二執(zhí)行計(jì)劃包括所述多個(gè)表的所述聯(lián)接順序,并且其中所述第一執(zhí)行計(jì)劃指定掃描所述多個(gè)表中的一個(gè)表的索引并且所述第二執(zhí)行計(jì)劃指定掃描所述多個(gè)表中的所述一個(gè)表而不使用所述索引。
12.根據(jù)權(quán)利要求8所述的方法,其中所述指令還包括通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分向所述結(jié)果集合存儲(chǔ)第一多行;并且通過(guò)所述執(zhí)行所述第二執(zhí)行計(jì)劃的所述部分向所述結(jié)果集合存儲(chǔ)第二多行,其中所述第一多行和所述第二多行的交集為空集。
13.根據(jù)權(quán)利要求12所述的方法,其中所述指令還包括如果所述通過(guò)所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分向所述結(jié)果集合存儲(chǔ)所述第一多行的速率大于比通過(guò)所述執(zhí)行所述第二執(zhí)行計(jì)劃的所述部分向所述結(jié)果集合存儲(chǔ)所述第二多行的速率更慢的閾值,則中止所述執(zhí)行所述第一執(zhí)行計(jì)劃的所述部分。
全文摘要
本發(fā)明涉及用于在多個(gè)線程中使用執(zhí)行計(jì)劃處理查詢的方法和系統(tǒng)。在一個(gè)實(shí)施例中,指明由實(shí)施查詢的第一執(zhí)行計(jì)劃指定的第一驅(qū)動(dòng)程序源,并且指明由實(shí)施查詢的第二執(zhí)行計(jì)劃指定的第二驅(qū)動(dòng)程序源。執(zhí)行第一執(zhí)行計(jì)劃的部分和第二執(zhí)行計(jì)劃的部分。如果通過(guò)執(zhí)行第一執(zhí)行計(jì)劃的部分所返回的第一行的唯一標(biāo)識(shí)符不匹配通過(guò)執(zhí)行第二執(zhí)行計(jì)劃的部分向結(jié)果集合保存的來(lái)自第二驅(qū)動(dòng)程序源的所有行的所有唯一標(biāo)識(shí)符,則向結(jié)果集合添加通過(guò)執(zhí)行第一執(zhí)行計(jì)劃的部分所返回的第一行,并且向唯一標(biāo)識(shí)符日志添加通過(guò)執(zhí)行第一執(zhí)行計(jì)劃的部分所返回的第一行的唯一標(biāo)識(shí)符。
文檔編號(hào)G06F9/46GK102541631SQ20111035309
公開(kāi)日2012年7月4日 申請(qǐng)日期2011年11月7日 優(yōu)先權(quán)日2010年12月21日
發(fā)明者B·R·穆拉斯, R·J·貝斯特根, R·V·道納 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司