基礎(chǔ)信息
權(quán)利要求
說明書
PDF全文
法律信息
引證文獻(xiàn)
著錄項(xiàng)信息
專利名稱 | 一種用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法和系統(tǒng) |
申請(qǐng)?zhí)?/td> | CN200810166365.6 | 申請(qǐng)日期 | 2008-09-26 |
法律狀態(tài) | 權(quán)利終止 | 申報(bào)國(guó)家 | 中國(guó) |
公開/公告日 | 2010-03-31 | 公開/公告號(hào) | CN101685449 |
優(yōu)先權(quán) | 暫無(wú) | 優(yōu)先權(quán)號(hào) | 暫無(wú) |
主分類號(hào) | G06F17/30 | IPC分類號(hào) | G;0;6;F;1;7;/;3;0查看分類表>
|
申請(qǐng)人 | 國(guó)際商業(yè)機(jī)器公司 | 申請(qǐng)人地址 | 美國(guó)紐約
變更
專利地址、主體等相關(guān)變化,請(qǐng)及時(shí)變更,防止失效 |
權(quán)利人 | 國(guó)際商業(yè)機(jī)器公司 | 當(dāng)前權(quán)利人 | 國(guó)際商業(yè)機(jī)器公司 |
發(fā)明人 | 李明;李海峰;孫云峰;趙勝 |
代理機(jī)構(gòu) | 北京市中咨律師事務(wù)所 | 代理人 | 于靜;楊曉光 |
摘要
提供了一種用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法和系統(tǒng)。所述方法包括:響應(yīng)于接收到數(shù)據(jù)查詢命令,其中所述數(shù)據(jù)查詢命令涉及來(lái)自至少兩個(gè)遠(yuǎn)程數(shù)據(jù)源的數(shù)據(jù),根據(jù)所述數(shù)據(jù)查詢命令生成針對(duì)第一數(shù)據(jù)源的子命令;根據(jù)所述子命令,以塊讀取的方式從所述第一數(shù)據(jù)源中檢索匹配數(shù)據(jù);將所檢索的塊數(shù)據(jù)中的至少相關(guān)列傳送到第二數(shù)據(jù)源并插入一個(gè)臨時(shí)表中,用于與第二數(shù)據(jù)源中的表進(jìn)行連接操作,其中所述相關(guān)列指的是與所述連接操作相關(guān)的列;并且從所述第二數(shù)據(jù)源接收經(jīng)過連接的結(jié)果集合。根據(jù)本發(fā)明的方法和系統(tǒng),可以減少在遠(yuǎn)程數(shù)據(jù)源中的磁盤輸入/輸出(I/O)成本、以及聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器和遠(yuǎn)程數(shù)據(jù)源之間的通信成本。
1.一種用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法,所述方法包括:
響應(yīng)于接收到數(shù)據(jù)查詢命令,其中所述數(shù)據(jù)查詢命令涉及來(lái)自至少兩個(gè)遠(yuǎn)程數(shù)據(jù)源的數(shù)據(jù),根據(jù)所述數(shù)據(jù)查詢命令生成針對(duì)第一數(shù)據(jù)源的子命令;
根據(jù)所述子命令,以塊讀取的方式從所述第一數(shù)據(jù)源中檢索匹配數(shù)據(jù);
將所檢索的塊數(shù)據(jù)中的至少相關(guān)列傳送到第二數(shù)據(jù)源并插入一個(gè)臨時(shí)表中,用于與第二數(shù)據(jù)源中的表進(jìn)行連接操作,其中所述相關(guān)列指的是與所述連接操作相關(guān)的列;并且從所述第二數(shù)據(jù)源接收經(jīng)過連接的結(jié)果集合。
2.根據(jù)權(quán)利要求1所述的方法,進(jìn)一步包括:
在以塊讀取的方式從所述第一數(shù)據(jù)源中檢索匹配數(shù)據(jù)之前,確定從所述第一數(shù)據(jù)源讀取的塊數(shù)據(jù)的大小。
3.根據(jù)權(quán)利要求2所述的方法,其中確定從所述第一數(shù)據(jù)源讀取的塊數(shù)據(jù)的大小的所述步驟進(jìn)一步包括:
計(jì)算在所述第二數(shù)據(jù)源中可用于執(zhí)行連接操作的最大存儲(chǔ)器大小除以將在所述第二數(shù)據(jù)源中建立的臨時(shí)表的最大行大小得到的最大行數(shù),以及可用本地高速緩存的最大存儲(chǔ)器大小除以所讀取的塊數(shù)據(jù)的最大行大小得到的最大行數(shù);以及
將二者中較小的行數(shù)值作為可讀取的塊數(shù)據(jù)的行數(shù)。
4.根據(jù)權(quán)利要求1所述的方法,進(jìn)一步包括:
響應(yīng)于從所述第一數(shù)據(jù)源所讀取的塊數(shù)據(jù)中的無(wú)關(guān)列的大小大于行指針列,僅將所述塊數(shù)據(jù)中的相關(guān)列以及所述行指針列傳送到所述第二數(shù)據(jù)源并插入所述臨時(shí)表中,其中所述無(wú)關(guān)列指的是與將在所述第二數(shù)據(jù)源中的表進(jìn)行的連接操作不相關(guān)的列,所述行指針列唯一地標(biāo)識(shí)了來(lái)自所述第一數(shù)據(jù)源的塊數(shù)據(jù)中的各個(gè)行。
5.根據(jù)權(quán)利要求4所述的方法,進(jìn)一步包括:
根據(jù)所述行指針列,將從所述第二數(shù)據(jù)源接收的經(jīng)過連接的結(jié)果集合與從所述第一數(shù)據(jù)源所檢索的塊數(shù)據(jù)直接合并以形成合并表。
6.根據(jù)權(quán)利要求1所述的方法,進(jìn)一步包括:
響應(yīng)于從所述第一數(shù)據(jù)源所讀取的塊數(shù)據(jù)中的無(wú)關(guān)列的大小小于行指針列,將所述塊數(shù)據(jù)中的全部列傳送到所述第二數(shù)據(jù)源并插入所述臨時(shí)表中,其中所述無(wú)關(guān)列指的是與將在所述第二數(shù)據(jù)源中的表進(jìn)行的連接操作不相關(guān)的列,所述行指針列唯一地標(biāo)識(shí)了來(lái)自所述第一數(shù)據(jù)源的塊數(shù)據(jù)中的各個(gè)行。
7.根據(jù)權(quán)利要求6所述的方法,進(jìn)一步包括:
將從所述第二數(shù)據(jù)源接收的經(jīng)過連接的結(jié)果集合直接存儲(chǔ)作為合并表。
8.根據(jù)權(quán)利要求1所述的方法,其中所述連接操作是哈希連接操作。
9.根據(jù)權(quán)利要求1所述的方法,其中所述連接操作是塊嵌套循環(huán)連接操作。
10.一種用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的系統(tǒng),所述系統(tǒng)包括:
用于響應(yīng)于接收到數(shù)據(jù)查詢命令,其中所述數(shù)據(jù)查詢命令涉及來(lái)自至少兩個(gè)遠(yuǎn)程數(shù)據(jù)源的數(shù)據(jù),根據(jù)所述數(shù)據(jù)查詢命令生成針對(duì)第一數(shù)據(jù)源的子命令的裝置;
用于根據(jù)所述子命令,以塊讀取的方式從所述第一數(shù)據(jù)源中檢索匹配數(shù)據(jù)的裝置;
用于所檢索的塊數(shù)據(jù)中的至少相關(guān)列傳送到第二數(shù)據(jù)源并插入一個(gè)臨時(shí)表中,用于與第二數(shù)據(jù)源中的表進(jìn)行連接操作的裝置,其中所述相關(guān)列指的是與所述連接操作相關(guān)的列;并且
用于從所述第二數(shù)據(jù)源接收經(jīng)過連接的結(jié)果集合的裝置。
11.根據(jù)權(quán)利要求10所述的系統(tǒng),進(jìn)一步包括:
用于在以塊讀取的方式從所述第一數(shù)據(jù)源中檢索匹配數(shù)據(jù)之前,確定從所述第一數(shù)據(jù)源讀取的塊數(shù)據(jù)的大小的裝置。
12.根據(jù)權(quán)利要求11所述的系統(tǒng),其中所述確定從所述第一數(shù)據(jù)源讀取的塊數(shù)據(jù)的大小的裝置進(jìn)一步用于:
計(jì)算在所述第二數(shù)據(jù)源中可用于執(zhí)行連接操作的最大存儲(chǔ)器大小除以將在所述第二數(shù)據(jù)源中建立的臨時(shí)表的最大行大小得到的最大行數(shù),以及可用本地高速緩存的最大存儲(chǔ)器大小除以所讀取的塊數(shù)據(jù)的最大行大小得到的最大行數(shù);以及
將二者中較小的行數(shù)值作為可讀取的塊數(shù)據(jù)的行數(shù)。
13.根據(jù)權(quán)利要求10所述的系統(tǒng),進(jìn)一步包括:
用于響應(yīng)于從所述第一數(shù)據(jù)源所讀取的塊數(shù)據(jù)中的無(wú)關(guān)列的大小大于行指針列,僅將所述塊數(shù)據(jù)中的相關(guān)列以及所述行指針列傳送到所述第二數(shù)據(jù)源并插入所述臨時(shí)表中的裝置,其中所述無(wú)關(guān)列指的是與將在所述第二數(shù)據(jù)源中的表進(jìn)行的連接操作不相關(guān)的列,所述行指針列唯一地標(biāo)識(shí)了來(lái)自所述第一數(shù)據(jù)源的塊數(shù)據(jù)中的各個(gè)行。
14.根據(jù)權(quán)利要求13所述的系統(tǒng),進(jìn)一步包括:
用于根據(jù)所述行指針列,將從所述第二數(shù)據(jù)源接收的經(jīng)過連接的結(jié)果集合與從所述第一數(shù)據(jù)源所檢索的塊數(shù)據(jù)直接合并以形成合并表的裝置。
15.根據(jù)權(quán)利要求10所述的系統(tǒng),進(jìn)一步包括:
用于響應(yīng)于從所述第一數(shù)據(jù)源所讀取的塊數(shù)據(jù)中的無(wú)關(guān)列的大小小于行指針列,將所述塊數(shù)據(jù)中的全部列傳送到所述第二數(shù)據(jù)源并插入所述臨時(shí)表中的裝置,其中所述無(wú)關(guān)列指的是與將在所述第二數(shù)據(jù)源中的表進(jìn)行的連接操作不相關(guān)的列,所述行指針列唯一地標(biāo)識(shí)了來(lái)自所述第一數(shù)據(jù)源的塊數(shù)據(jù)中的各個(gè)行。
16.根據(jù)權(quán)利要求15所述的系統(tǒng),進(jìn)一步包括:
用于將從所述第二數(shù)據(jù)源接收的經(jīng)過連接的結(jié)果集合直接存儲(chǔ)作為合并表的裝置。
17.根據(jù)權(quán)利要求10所述的系統(tǒng),其中所述連接操作是哈希連接操作。
18.根據(jù)權(quán)利要求10所述的系統(tǒng),其中所述連接操作是塊嵌套循環(huán)連接操作。
一種用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法和系統(tǒng)\n技術(shù)領(lǐng)域\n[0001] 本發(fā)明一般地涉及數(shù)據(jù)庫(kù)信息管理系統(tǒng),并且具體而言涉及一種用于連接(join)多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法和系統(tǒng)。\n背景技術(shù)\n[0002] 在大型的現(xiàn)代企業(yè)中,以下情形將是不可避免的:即,一家機(jī)構(gòu)的不同部門使用不同的數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)來(lái)存儲(chǔ)和檢索它們的關(guān)鍵數(shù)據(jù)。而只有通過將這些系統(tǒng)的信息結(jié)合起來(lái),該機(jī)構(gòu)才能夠?qū)崿F(xiàn)這些數(shù)據(jù)的完整價(jià)值。\n[0003] 例如,在金融領(lǐng)域,并購(gòu)幾乎是常常出現(xiàn)的。新創(chuàng)建的機(jī)構(gòu)將會(huì)繼承原始機(jī)構(gòu)的數(shù)據(jù)庫(kù),而這些數(shù)據(jù)庫(kù)中的許多都是關(guān)系數(shù)據(jù)庫(kù),但來(lái)自于不同的制造商。它們可能具有一個(gè)或多個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)。每個(gè)數(shù)據(jù)庫(kù)可以具有用于計(jì)算重要信息的不同應(yīng)用。在并購(gòu)之后,新機(jī)構(gòu)需要能夠訪問所有數(shù)據(jù)庫(kù)的所有客戶信息,使用現(xiàn)有應(yīng)用以及新的應(yīng)用來(lái)分析新的數(shù)據(jù),并且通過一個(gè)公用接口使用兩家機(jī)構(gòu)的合并資源。新機(jī)構(gòu)需要能夠識(shí)別兩者的公共客戶,并且合并其帳戶,但是不同機(jī)構(gòu)可能在不同數(shù)據(jù)庫(kù)中使用完全不同的識(shí)別鍵(key)來(lái)引用其客戶。\n[0004] 由此可見,存在一種持續(xù)需要,即,連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)從而使能對(duì)存儲(chǔ)于多個(gè)異構(gòu)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的透明訪問。在此,“透明”意味著在特定位置的應(yīng)用程序能夠訪問所有相連的數(shù)據(jù)庫(kù)中的數(shù)據(jù),而不用知道數(shù)據(jù)的來(lái)源以及本地?cái)?shù)據(jù)庫(kù)與多個(gè)相連的遠(yuǎn)程數(shù)據(jù)庫(kù)中的任一個(gè)是否兼容。即,如果一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)是透明的,則它使得底層數(shù)據(jù)源的不同之處、特質(zhì)、以及實(shí)現(xiàn)方式對(duì)于用戶是屏蔽的。\n[0005] 為了提供針對(duì)多個(gè)異構(gòu)數(shù)據(jù)庫(kù)的透明接口,在現(xiàn)有技術(shù)中,一般使用一個(gè)獨(dú)立數(shù)據(jù)庫(kù)作為統(tǒng)一的交互接口,并且使該接口能夠在數(shù)據(jù)庫(kù)管理系統(tǒng)的控制下,根據(jù)接口表中包含的數(shù)據(jù)項(xiàng)訪問其它數(shù)據(jù)庫(kù)的數(shù)據(jù)。這種系統(tǒng)的當(dāng)前設(shè)計(jì)被稱為聯(lián)邦(federated)數(shù)據(jù)庫(kù)服務(wù)器。聯(lián)邦(federation)技術(shù)可以通過提供對(duì)各種數(shù)據(jù)的統(tǒng)一接口而極大地便利于對(duì)異構(gòu)數(shù)據(jù)的集成。現(xiàn)今,聯(lián)邦技術(shù)使能了對(duì)任意信息存儲(chǔ)庫(kù)中的任意格式(結(jié)構(gòu)化的和非結(jié)構(gòu)化的)的任意數(shù)字信息的統(tǒng)一訪問。關(guān)于聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器的更多細(xì)節(jié),請(qǐng)參見http://www.ibm.com/developerworks/db2/library/techarticle/0203haas/0203haas.html,在此通過將其整體引入作為參考。在現(xiàn)有技術(shù)中,在兩個(gè)或多個(gè)異構(gòu)數(shù)據(jù)庫(kù)中的表之間進(jìn)行連接操作常常是成本高昂的。本發(fā)明提供了一種優(yōu)化技術(shù)。\n發(fā)明內(nèi)容\n[0006] 本發(fā)明的目的是提供一種用于通過聯(lián)邦數(shù)據(jù)庫(kù)系統(tǒng)對(duì)于多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)進(jìn)行表連接的優(yōu)化方法和系統(tǒng),其中用于進(jìn)行連接的基表都位于遠(yuǎn)程異構(gòu)數(shù)據(jù)庫(kù)中,所述方法和系統(tǒng)可以減少在遠(yuǎn)程數(shù)據(jù)庫(kù)中的磁盤輸入/輸出(I/O)成本、以及聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器和遠(yuǎn)程數(shù)據(jù)庫(kù)之間的通信成本。\n[0007] 在本發(fā)明的第一方面中,提出了一種用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法,所述方法包括:\n[0008] 響應(yīng)于接收到數(shù)據(jù)查詢命令,其中所述數(shù)據(jù)查詢命令涉及來(lái)自至少兩個(gè)遠(yuǎn)程數(shù)據(jù)源的數(shù)據(jù),根據(jù)所述數(shù)據(jù)查詢命令生成針對(duì)第一數(shù)據(jù)源的子命令;\n[0009] 根據(jù)所述子命令,以塊讀取的方式從所述第一數(shù)據(jù)源中檢索匹配數(shù)據(jù);\n[0010] 將所檢索的塊數(shù)據(jù)中的至少相關(guān)列傳送到第二數(shù)據(jù)源并插入一個(gè)臨時(shí)表中,用于與第二數(shù)據(jù)源中的表進(jìn)行連接操作,其中所述相關(guān)列指的是與所述連接操作相關(guān)的列;并且\n[0011] 從所述第二數(shù)據(jù)源接收經(jīng)過連接的結(jié)果集合。\n[0012] 在本發(fā)明的第二方面中,提出了一種用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的系統(tǒng),所述系統(tǒng)包括:\n[0013] 用于響應(yīng)于接收到數(shù)據(jù)查詢命令,其中所述數(shù)據(jù)查詢命令涉及來(lái)自至少兩個(gè)遠(yuǎn)程數(shù)據(jù)源的數(shù)據(jù),根據(jù)所述數(shù)據(jù)查詢命令生成針對(duì)第一數(shù)據(jù)源的子命令的裝置;\n[0014] 用于根據(jù)所述子命令,以塊讀取的方式從所述第一數(shù)據(jù)源中檢索匹配數(shù)據(jù)的裝置;\n[0015] 用于所檢索的塊數(shù)據(jù)中的至少相關(guān)列傳送到第二數(shù)據(jù)源并插入一個(gè)臨時(shí)表中,用于與第二數(shù)據(jù)源中的表進(jìn)行連接操作的裝置,其中所述相關(guān)列指的是與所述連接操作相關(guān)的列;并且\n[0016] 用于從所述第二數(shù)據(jù)源接收經(jīng)過連接的結(jié)果集合的裝置。\n[0017] 在本發(fā)明的第三方面中,提出了一種計(jì)算機(jī)程序產(chǎn)品,其可被加載到計(jì)算機(jī)上并包括程序代碼工具,當(dāng)所述計(jì)算機(jī)程序產(chǎn)品在計(jì)算機(jī)上運(yùn)行時(shí),所述程序代碼工具適于執(zhí)行所述的用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法的所有步驟。\n[0018] 根據(jù)本發(fā)明的方法和系統(tǒng),可以顯著地提高跨多個(gè)遠(yuǎn)程異構(gòu)數(shù)據(jù)庫(kù)執(zhí)行表的連接操作的性能。在上述第二遠(yuǎn)程數(shù)據(jù)源上,還可以通過哈希連接操作,能夠在不用多次遍歷第二數(shù)據(jù)源包含的表的情況下,查詢到其中的匹配列并執(zhí)行連接操作,從而可以極大地減少磁盤I/O成本。哈希連接操作特別適用于下述任一情形或幾種情形的組合:第二數(shù)據(jù)源包含的表中不存在索引、該表非常大。同時(shí),通過使用塊操作以及在第二數(shù)據(jù)源中創(chuàng)建用于連接操作的臨時(shí)表,減少了各組件之間的通信成本。\n附圖說明\n[0019] 在附帶的權(quán)利要求中闡明了被認(rèn)為是本發(fā)明新穎特性的特征。然而,通過參考以下結(jié)合附圖的說明性實(shí)施例的詳細(xì)描述,將最好地理解本發(fā)明本身以及其優(yōu)選使用模式、另外的目的和優(yōu)點(diǎn),在附圖中:\n[0020] 圖1描述了在現(xiàn)有技術(shù)中實(shí)現(xiàn)用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法的交互過程的示意性框圖;\n[0021] 圖2描述了實(shí)現(xiàn)根據(jù)本發(fā)明一個(gè)實(shí)施例的用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法和組件間交互過程的示意性框圖;\n[0022] 圖3說明了一種根據(jù)本發(fā)明一個(gè)實(shí)施例的用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法的詳細(xì)流程圖;以及\n[0023] 圖4說明了一種根據(jù)本發(fā)明一個(gè)實(shí)施例的用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的系統(tǒng)的示意性框圖。\n[0024] 需要注意,在全體附圖中,相同或相似的標(biāo)號(hào)指代的是相同或相似的單元或組件。\n具體實(shí)施方式\n[0025] 在下文中將結(jié)合附圖對(duì)本發(fā)明的示范性實(shí)施例進(jìn)行描述。為了清楚和簡(jiǎn)明起見,在說明書中并未描述實(shí)際實(shí)現(xiàn)方式的所有特征。然而,應(yīng)該了解,在開發(fā)任何這種實(shí)際實(shí)施例的過程中必須做出很多實(shí)現(xiàn)方式所特定的決定,以便實(shí)現(xiàn)開發(fā)人員的具體目標(biāo),例如符合與系統(tǒng)及業(yè)務(wù)相關(guān)的那些限制條件,其中,這些限制條件會(huì)隨著實(shí)施方式的不同而改變。\n此外,還應(yīng)該了解,雖然開發(fā)工作有可能是非常復(fù)雜和費(fèi)時(shí)的,但對(duì)得益于這個(gè)公開內(nèi)容的本領(lǐng)域技術(shù)人員來(lái)說,這種開發(fā)工作僅僅是例行的任務(wù)。\n[0026] 此外,還需要說明的一點(diǎn)是,為了避免因不必要的細(xì)節(jié)而混淆了本發(fā)明,在附圖中僅僅示出了與根據(jù)本發(fā)明的方案密切相關(guān)的裝置結(jié)構(gòu)和/或處理步驟,而省略了與本發(fā)明關(guān)系不大的其它細(xì)節(jié)。\n[0027] 參見圖1,描述了在現(xiàn)有技術(shù)中實(shí)現(xiàn)用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法的交互過程的示意性框圖。如圖1所示,聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150通過網(wǎng)絡(luò)與位于遠(yuǎn)程的客戶端100、數(shù)據(jù)源1110、數(shù)據(jù)源2120分別進(jìn)行通信,所述網(wǎng)絡(luò)可以是局域網(wǎng)(LAN)、廣域網(wǎng)(WAN)、虛擬專用網(wǎng)(VPN)、以及因特網(wǎng)等等。兩個(gè)數(shù)據(jù)源就是兩個(gè)遠(yuǎn)程數(shù)據(jù)庫(kù),其中數(shù)據(jù)源\n1110包含表T1112,數(shù)據(jù)源2120包含表T2122。注意,為了簡(jiǎn)明起見,在本示例以及本發(fā)明的上下文中,均僅使用兩個(gè)數(shù)據(jù)源來(lái)進(jìn)行說明。當(dāng)然,本領(lǐng)域技術(shù)人員可以理解,根據(jù)本發(fā)明實(shí)施例的方案同樣良好地適用于多個(gè)數(shù)據(jù)庫(kù)以及其上存儲(chǔ)的多個(gè)表。\n[0028] 首先,在步驟1,客戶端100的用戶通過其上運(yùn)行的應(yīng)用向聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150提交數(shù)據(jù)檢索命令。例如,所提交的命令可以是以下的SQL查詢語(yǔ)句:\n[0029] select T1.C1,T1.C2,T2.C2from T1,T2where T1.C1=T2.C1該語(yǔ)句想要從表T1112中檢索數(shù)據(jù)T1.C1、T1.C2以及從表T2122中檢索數(shù)據(jù)T2.C2,并且所檢索的數(shù)據(jù)還要滿足條件T1.C1=T2.C1。用戶期望得到的結(jié)果是一個(gè)經(jīng)過連接的結(jié)果表,其中的每一行均包含來(lái)自表T1112和表T2122的匹配數(shù)據(jù)。\n[0030] 聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150負(fù)責(zé)處理從客戶端100接收的SQL查詢語(yǔ)句,并通過查詢優(yōu)化器(未示出)確定用于訪問所請(qǐng)求的數(shù)據(jù)的最優(yōu)執(zhí)行方法。在查詢優(yōu)化操作期間,通常會(huì)考慮多種類型的連接方法以及連接次序,所述連接方法例如可以包括:合并連接、嵌套循環(huán)連接等。當(dāng)來(lái)自“外表(outertable)”的行將與一個(gè)或多個(gè)其它表(即“內(nèi)表(inner table)”)的行相連接時(shí),需要使用連接方法。在此,術(shù)語(yǔ)“表”包括數(shù)據(jù)的任意表格式的列表。術(shù)語(yǔ)“外表”指代這樣的表:數(shù)據(jù)庫(kù)應(yīng)用從該表中直接檢索搜索名稱;而“內(nèi)表”指代這樣的表:基于從外表所檢索的搜索名稱,數(shù)據(jù)庫(kù)應(yīng)用從該表中進(jìn)一步檢索數(shù)據(jù)。圖1所示的用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法是通常由查詢優(yōu)化器所選擇的一種方法。\n[0031] 當(dāng)確定所接收的SQL查詢語(yǔ)句是“連接SQL查詢語(yǔ)句”時(shí)(“連接SQL查詢語(yǔ)句”意味著:該SQL查詢語(yǔ)句涉及來(lái)自至少兩個(gè)數(shù)據(jù)源的數(shù)據(jù)),聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150將需要對(duì)至少兩個(gè)不同的遠(yuǎn)程異構(gòu)數(shù)據(jù)庫(kù)(數(shù)據(jù)源)中表的已檢索數(shù)據(jù)執(zhí)行連接操作。于是,在此示例中,查詢優(yōu)化器通常首先把所接收的SQL查詢語(yǔ)句劃分為兩個(gè)SQL子語(yǔ)句,其中每個(gè)語(yǔ)句分別描述了需要在每個(gè)遠(yuǎn)程數(shù)據(jù)庫(kù)上執(zhí)行的操作。\n[0032] 例如,在本示例中,所劃分的第一SQL子語(yǔ)句為:\n[0033] select T1.C1,T1.C2from T1\n[0034] 該語(yǔ)句用于從表T1 112中選擇數(shù)據(jù)T1.C1、T1.C2;\n[0035] 以及,所劃分的第二SQL子語(yǔ)句為:\n[0036] select T2.C2from T2where T2.C1=X\n[0037] 該語(yǔ)句用于從表T2122中選擇數(shù)據(jù)T2.C2,其中所選擇的數(shù)據(jù)需要滿足條件T2.C1=X,其中X表示通過第一SQL子語(yǔ)句從表T1中獲得的T1.C1。\n[0038] 由查詢優(yōu)化器來(lái)決定在查詢中涉及的不同操作是應(yīng)該由服務(wù)器150還是存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)源來(lái)執(zhí)行。為了做出決定,優(yōu)化器必須知道每個(gè)數(shù)據(jù)源能夠做什么以及這樣做的執(zhí)行成本。例如,如果數(shù)據(jù)源僅是一個(gè)文件,那么服務(wù)器無(wú)法要求它執(zhí)行排序或應(yīng)用某種函數(shù)。另一方面,如果數(shù)據(jù)源是能夠應(yīng)用謂詞并且執(zhí)行連接操作的關(guān)系數(shù)據(jù)庫(kù)系統(tǒng),那么,如果該關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)能夠在遠(yuǎn)程執(zhí)行某些處理從而減少必須返回服務(wù)器150的數(shù)據(jù)量,則利用該數(shù)據(jù)庫(kù)系統(tǒng)的能力將是更佳的。所述決定典型地將取決于各個(gè)查詢的細(xì)節(jié)。在此假定數(shù)據(jù)源2 120是關(guān)系數(shù)據(jù)庫(kù)系統(tǒng),其能夠執(zhí)行必要的數(shù)據(jù)查詢操作以及執(zhí)行復(fù)雜的函數(shù)運(yùn)算,則聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150將使得數(shù)據(jù)源2 120能夠執(zhí)行某些特定處理,從而減少服務(wù)器150的計(jì)算成本以及二者之間的通信成本。\n[0039] 繼續(xù)參見圖1,在步驟2,聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150將第一SQL子語(yǔ)句發(fā)送到數(shù)據(jù)源\n1 110,并從數(shù)據(jù)源1 110獲得返回的匹配檢索結(jié)果。數(shù)據(jù)源1 110根據(jù)所接收的第一SQL子語(yǔ)句查詢表T1,并且每次將一行匹配數(shù)據(jù)152返回服務(wù)器150作為檢索結(jié)果,例如一行特定的數(shù)據(jù)T1.C1、T1.C2。\n[0040] 在步驟3,對(duì)于所獲得的匹配檢索結(jié)果的每一行,聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150通過該行中包含的數(shù)據(jù)來(lái)生成第二SQL子語(yǔ)句。所述生成是通過將第一SQL子語(yǔ)句所獲得的行中的對(duì)應(yīng)列作為綁定參數(shù)來(lái)生成第二SQL子語(yǔ)句。即,用檢索到的T1.C1的數(shù)值來(lái)替換第二SQL子語(yǔ)句中的X參數(shù)。接著聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150將所生成的第二SQL子語(yǔ)句發(fā)送到數(shù)據(jù)源\n2120。\n[0041] 在步驟4,數(shù)據(jù)源2 120根據(jù)所接收的第二SQL子語(yǔ)句遍歷表T2 122,并且將滿足該子語(yǔ)句的結(jié)果集合154返回聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150作為檢索結(jié)果,該結(jié)果集合154被稱為中間結(jié)果行。服務(wù)器150讀取從數(shù)據(jù)源2 120返回的中間結(jié)果行。\n[0042] 接著在步驟5,聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150對(duì)所返回的中間結(jié)果行與通過第一SQL子語(yǔ)句從數(shù)據(jù)源1 110讀取的一行數(shù)據(jù)進(jìn)行合并,從而生成合并表156。然后聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器\n150將合并表156返回給客戶端100。\n[0043] 步驟2-5將被重復(fù)執(zhí)行,直到根據(jù)第一SQL子語(yǔ)句將表T1 112中的所有匹配的可用數(shù)據(jù)都檢索完、并相應(yīng)地執(zhí)行對(duì)表T2 122的檢索以及對(duì)兩個(gè)檢索結(jié)果的合并之后為止。\n[0044] 上述實(shí)現(xiàn)方式的問題在于,對(duì)于從數(shù)據(jù)源1 110的外表T1 112獲得的每一行,聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150需要與內(nèi)表T2 122所在的數(shù)據(jù)源2 120進(jìn)行通信,并在整個(gè)內(nèi)表中掃描每一行,以獲得相應(yīng)的匹配數(shù)據(jù)。這被稱為嵌套循環(huán)連接(Nested Loop Join)。在該過程中,由于內(nèi)表將被重復(fù)地進(jìn)行多次遍歷,因此當(dāng)該表數(shù)據(jù)無(wú)法全部裝入數(shù)據(jù)源2 120的存儲(chǔ)器時(shí),這將帶來(lái)數(shù)據(jù)源2 120上很高的磁盤輸入/輸出(I/O)成本。而且隨著內(nèi)表的不斷增大,這種I/O成本會(huì)更明顯地影響性能。并且,由于需要不斷地在不同的物理機(jī)器(服務(wù)器150、數(shù)據(jù)源1 110、數(shù)據(jù)源2 120)之間傳遞SQL語(yǔ)句和返回結(jié)果,上述過程還將帶來(lái)很高的通信成本。\n[0045] 如上所述,本發(fā)明的目的是提供一種用于優(yōu)化對(duì)多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的連接操作的方法和系統(tǒng),其可以減少數(shù)據(jù)源的磁盤I/O成本和在不同物理機(jī)器之間的通信成本,從而能夠?qū)Χ鄠€(gè)數(shù)據(jù)庫(kù)中的表執(zhí)行改進(jìn)的連接操作。\n[0046] 本發(fā)明方案的主要改進(jìn)在于:聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器在接收到用戶的SQL命令并生成針對(duì)數(shù)據(jù)源1的子命令之后,以塊讀取的方式從數(shù)據(jù)源1中的外表讀取數(shù)據(jù);在數(shù)據(jù)源2上創(chuàng)建一個(gè)用于執(zhí)行與內(nèi)表的連接操作的臨時(shí)表,其存儲(chǔ)從服務(wù)器接收的數(shù)據(jù)源1的塊數(shù)據(jù)(至少包含與所述連接操作相關(guān)的列);對(duì)臨時(shí)表中的數(shù)據(jù)與數(shù)據(jù)源2的內(nèi)表的本地?cái)?shù)據(jù)執(zhí)行哈希連接或者塊嵌套循環(huán)連接,而不用對(duì)于來(lái)自外表的每一行都掃描一次整個(gè)內(nèi)表;以及將連接結(jié)果返回服務(wù)器。通過該改進(jìn)的方法,對(duì)于內(nèi)表的物理訪問次數(shù)可以顯著減少,從而減少了數(shù)據(jù)源2的磁盤I/O成本??蛇x地,將來(lái)自數(shù)據(jù)源1的塊數(shù)據(jù)中與執(zhí)行連接操作無(wú)關(guān)的列保留在服務(wù)器而不傳送到數(shù)據(jù)源2,同時(shí)用一個(gè)額外的行指針列來(lái)替代這些無(wú)關(guān)列,從而減少了聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器與遠(yuǎn)程數(shù)據(jù)源之間的通信成本。\n[0047] 具體而言,參見圖2描述了實(shí)現(xiàn)根據(jù)本發(fā)明一個(gè)實(shí)施例的用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中表的方法和組件間交互過程的示意性框圖。繼續(xù)采用圖1中的示例。如圖2所示,聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150與位于遠(yuǎn)程的客戶端100、數(shù)據(jù)源1 110、數(shù)據(jù)源2 120分別進(jìn)行通信。\n[0048] 首先,在步驟1,客戶端100的用戶通過其上運(yùn)行的應(yīng)用向聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150提交數(shù)據(jù)檢索命令。例如,所提交的命令可以是以下的SQL查詢語(yǔ)句:\n[0049] select T1.C1,T1.C2,T2.C2from T1,T2where T1.C1=T2.C1該語(yǔ)句將從表T1 \n112中檢索數(shù)據(jù)T1.C1、T1.C2以及從表T2 122中檢索數(shù)據(jù)T2.C2,并且所檢索的數(shù)據(jù)還要滿足條件T1.C1=T2.C1。用戶期望得到的結(jié)果是一個(gè)經(jīng)過連接的結(jié)果表,其中的每一行均包含來(lái)自表T1 112和表T2 122的匹配數(shù)據(jù)。\n[0050] 當(dāng)確定所接收的SQL查詢語(yǔ)句是“連接SQL查詢語(yǔ)句”時(shí),查詢優(yōu)化器首先根據(jù)所接收的SQL查詢語(yǔ)句生成針對(duì)外表(表T1)所在的遠(yuǎn)程數(shù)據(jù)源的操作的一個(gè)SQL子語(yǔ)句,其中該語(yǔ)句描述了需要在該遠(yuǎn)程數(shù)據(jù)源上執(zhí)行的操作。\n[0051] 例如,在本示例中,所生成的SQL子語(yǔ)句為:\n[0052] select T1.C1,T1.C2from T1\n[0053] 該語(yǔ)句用于從表T1 112中選擇數(shù)據(jù)T1.C1、T1.C2。\n[0054] 在步驟2,聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150將該SQL子語(yǔ)句發(fā)送到數(shù)據(jù)源1 110,并從數(shù)據(jù)源1 110獲得返回的匹配檢索結(jié)果。數(shù)據(jù)源1 110根據(jù)所接收的SQL子語(yǔ)句查詢表T1,并且以塊讀取的方式每次將塊數(shù)據(jù)158(而不是一行數(shù)據(jù))返回服務(wù)器150作為檢索結(jié)果,例如每次返回100個(gè)特定的數(shù)據(jù)T1.C1、T1.C2。下文中將具體說明如何確定所讀取的塊的行數(shù)。\n[0055] 聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150以塊為單位從數(shù)據(jù)源1 110讀取表T1 112的數(shù)據(jù),并存儲(chǔ)所讀取的塊數(shù)據(jù)158。每次讀取的塊數(shù)據(jù)的行數(shù)可以這樣確定:由查詢優(yōu)化器計(jì)算在數(shù)據(jù)源2 120中可用于執(zhí)行哈希連接操作或者塊嵌套循環(huán)連接操作的最大存儲(chǔ)器大小除以將在數(shù)據(jù)源2 120中建立的臨時(shí)表的最大行大小得到的最大行數(shù)(如果數(shù)據(jù)源2 120支持哈希連接或者塊嵌套循環(huán)連接的話)以及服務(wù)器150的可用本地高速緩存的最大存儲(chǔ)器大小除以所讀取的塊數(shù)據(jù)的最大行大小得到的最大行數(shù),以二者中較小的行數(shù)值作為可讀取的塊數(shù)據(jù)的行數(shù),從而獲得可讀取的塊的最大行數(shù)。數(shù)據(jù)源2120中可用于計(jì)算哈希連接或者塊嵌套循環(huán)連接的最大存儲(chǔ)器大小通常由該類數(shù)據(jù)源的選項(xiàng)(屬性值)所標(biāo)記;而服務(wù)器\n150的可用本地高速緩存的最大存儲(chǔ)器大小通常是作為數(shù)據(jù)庫(kù)管理系統(tǒng)參數(shù)而存在。二者均可以容易地獲取到。\n[0056] 聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150基于上述確定的最大行數(shù),使用塊讀取從數(shù)據(jù)源1 110獲取數(shù)據(jù)。當(dāng)數(shù)據(jù)源1 110中的數(shù)據(jù)全部讀取完成或者達(dá)到塊讀取的最大行數(shù)時(shí),所述塊讀取結(jié)束。\n[0057] 在步驟3,聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150將從數(shù)據(jù)源1 110所獲得的作為檢索結(jié)果的塊數(shù)據(jù)傳送到數(shù)據(jù)源2 120,并插入在數(shù)據(jù)源2 120中創(chuàng)建的臨時(shí)表124中。\n[0058] 可選地,為了減少聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150與數(shù)據(jù)源2120之間的通信成本,可以將來(lái)自數(shù)據(jù)源1的塊數(shù)據(jù)中的無(wú)關(guān)列保留在服務(wù)器一端而不傳送到數(shù)據(jù)源2,以及用一個(gè)額外的行指針列來(lái)替代這些無(wú)關(guān)列,所述無(wú)關(guān)列指的是將與所述第二數(shù)據(jù)源中的表進(jìn)行的連接操作不相關(guān)的列,例如上述示例中的T1.C2。通過使用行指針列,可以只在所創(chuàng)建的臨時(shí)表124中包含與所述連接操作有關(guān)的列,且無(wú)需在服務(wù)器150上再次執(zhí)行對(duì)于從數(shù)據(jù)源1返回的塊數(shù)據(jù)與從數(shù)據(jù)源2返回的中間結(jié)果列的連接操作(該操作是費(fèi)時(shí)的)。行指針列是臨時(shí)表中的一個(gè)額外列,其唯一地標(biāo)識(shí)了來(lái)自數(shù)據(jù)源1的塊數(shù)據(jù)中的各個(gè)行。查詢優(yōu)化器首先確定行指針的大小是否大于與執(zhí)行連接操作無(wú)關(guān)的列的大小,因?yàn)樵趬K數(shù)據(jù)158中可能不存在無(wú)關(guān)列或者僅存在很少的無(wú)關(guān)列,此時(shí)行指針就變得不必要了。在此示例中,與執(zhí)行連接操作無(wú)關(guān)的列為T1.C2。如果T1.C2列大于行指針列,則將T1.C2列保留在服務(wù)器\n150,而將行指針列添加到臨時(shí)表154中。這樣,當(dāng)在數(shù)據(jù)源2得到的中間結(jié)果列被返回服務(wù)器150時(shí),不用再與來(lái)自數(shù)據(jù)源1的塊數(shù)據(jù)進(jìn)行連接,而是直接將具有相同行指針的中間結(jié)果列和塊數(shù)據(jù)進(jìn)行合并。這樣將極大地節(jié)約服務(wù)器150的計(jì)算成本。\n[0059] 注意,對(duì)于是否使用行指針列的確定還可能影響之前確定的從數(shù)據(jù)源1進(jìn)行讀取的塊的最大行數(shù)。具體地,如果確定使用行指針列,臨時(shí)表中的列較少,于是經(jīng)由數(shù)據(jù)源2 \n120中的可用最大存儲(chǔ)器大小除以臨時(shí)表的最大行大小而得到的最大行數(shù)較大。反之,則所確定的最大行數(shù)較小。從而在將所確定的最大行數(shù)與經(jīng)由服務(wù)器150的可用本地高速緩存的最大存儲(chǔ)器大小除以所讀取的塊數(shù)據(jù)的最大行大小得到的最大行數(shù)進(jìn)行比較的過程中,可能得到不同的結(jié)果。由此可見,對(duì)于是否使用行指針列的確定應(yīng)該在確定對(duì)于數(shù)據(jù)源1的塊讀取操作之前完成,即,在塊讀取之前,由聯(lián)邦數(shù)據(jù)庫(kù)系統(tǒng)從數(shù)據(jù)源1讀取表T1的相關(guān)列的屬性,以確定是否使用行指針列,從而進(jìn)一步確定所讀取的塊的最大行數(shù)。\n[0060] 查詢優(yōu)化器還需要確定數(shù)據(jù)源2 120是否支持哈希連接或者塊嵌套循環(huán)連接操作,這通常由該類數(shù)據(jù)源的屬性值所標(biāo)記。哈希連接操作包括以下步驟:對(duì)臨時(shí)表124執(zhí)行哈希算法形成哈希表,使得具有相同或相似哈希結(jié)果值的原始列將被看成是相同的哈希列;這樣,首先比較哈希表與表T2 122,在結(jié)果值相匹配的情況下,再尋找臨時(shí)表124中相應(yīng)的匹配列;之后對(duì)臨時(shí)表124與表2 122中的匹配列執(zhí)行連接操作,得到結(jié)果集合。通過哈希連接操作,能夠在不用多次遍歷整個(gè)內(nèi)表T2的情況下,查詢到其中的匹配列并執(zhí)行連接操作,從而可以極大地減少磁盤I/O成本。上述的哈希連接操作特別適用于下述任一情形或幾種情形的組合:表T2中不存在索引、表T2極大。在上述情形中,哈希連接操作所節(jié)約的計(jì)算成本更為顯著。\n[0061] 繼續(xù)參見圖2,在步驟4,如果數(shù)據(jù)源2 120支持哈希連接,則對(duì)臨時(shí)表124中的數(shù)據(jù)與表T2 122執(zhí)行哈希連接操作,以生成結(jié)果集合,也就是中間結(jié)果行。根據(jù)上述對(duì)于塊數(shù)據(jù)大小的確定,由于臨時(shí)表124的大小不大于數(shù)據(jù)源2 120中的可用于執(zhí)行哈希連接的最大存儲(chǔ)器大小,因此數(shù)據(jù)源2 120能夠直接將臨時(shí)表124中的數(shù)據(jù)用于哈希連接。在哈希連接操作期間,僅需要掃描原始的內(nèi)表(表T2)一次。\n[0062] 如果數(shù)據(jù)源2 120不支持哈希連接,則對(duì)臨時(shí)表124中的數(shù)據(jù)與表T2122執(zhí)行塊嵌套循環(huán)連接操作以生成結(jié)果集合。該操作的實(shí)現(xiàn)方式類似于常規(guī)的嵌套循環(huán)連接操作,在此不再描述。\n[0063] 在步驟5,聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150讀取從數(shù)據(jù)源2 120返回的中間結(jié)果行作為結(jié)果集合154。\n[0064] 之后,在步驟6,如果在臨時(shí)表124中使用了行指針列,則服務(wù)器150把結(jié)果集合\n154與塊數(shù)據(jù)158直接合并以形成合并表156。由于行指針列的唯一性,執(zhí)行所述合并的開銷極小。如果在臨時(shí)表124中未使用行指針列,其表示塊數(shù)據(jù)158的所有列都被存儲(chǔ)到臨時(shí)表124中并執(zhí)行了連接操作,則所返回的結(jié)果集合154可以被直接作為合并表156。聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150將合并表156返回給客戶端100。\n[0065] 步驟2-6將被重復(fù)執(zhí)行,直到根據(jù)上述SQL子語(yǔ)句將表T1112中的所有匹配的可用數(shù)據(jù)都檢索完、并相應(yīng)地執(zhí)行對(duì)表T2122的檢索和連接以及對(duì)兩個(gè)檢索結(jié)果的合并之后為止。\n[0066] 注意,本領(lǐng)域技術(shù)人員可以容易地理解,對(duì)于兩個(gè)以上的遠(yuǎn)程數(shù)據(jù)源的情形,本發(fā)明方法同樣可以適用。例如,當(dāng)存在三個(gè)數(shù)據(jù)源時(shí),聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器可以根據(jù)SQL查詢命令生成針對(duì)第一數(shù)據(jù)源的SQL子命令。首先基于該SQL子命令,對(duì)于第一數(shù)據(jù)源和第二數(shù)據(jù)源完成與上述相同的連接操作(哈希連接操作或者塊嵌套循環(huán)連接操作)的過程,然后將從第二數(shù)據(jù)源接收的結(jié)果集合看作為另一個(gè)塊數(shù)據(jù),并將該塊數(shù)據(jù)的全部列(或者僅相關(guān)列和額外的行指針列)傳送到第三數(shù)據(jù)源并插入一個(gè)臨時(shí)表中,用于與第三數(shù)據(jù)源中的數(shù)據(jù)進(jìn)行連接操作。其余過程與上述針對(duì)兩個(gè)數(shù)據(jù)源的過程相類似,在此不再進(jìn)行詳細(xì)描述。\n[0067] 下面參考圖3并結(jié)合一個(gè)簡(jiǎn)單的示例來(lái)說明一種根據(jù)本發(fā)明一個(gè)實(shí)施例的用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中表的方法的詳細(xì)流程圖。例如,從客戶端100發(fā)送到聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150的SQL查詢命令為:\n[0068] select A.A1,A.A2,A.A3,B.B2from A,B where A.A3=B.B1該SQL語(yǔ)句將從表A中檢索數(shù)據(jù)A.A1、A.A2、A.A3以及從表B中檢索數(shù)據(jù)B.B2,并且要滿足條件A.A3=B.B1。\n為了說明的簡(jiǎn)要起見,假定A.A3和B.B1列都是整數(shù)(INT)類型,且假定A.A3的值均勻分布在1..10之間。示例性的表A如以下表格1所示(共200行):\n[0069] \n列A1列A2列A3\nX1 Y1 1\nX2 Y2 2\n... ... ...\nX10 Y10 10\nX11 Y11 1\nX12 Y12 2\n... ...\nX20 Y20 10\n... ... ...\n... ... ...\nX198 Y198 8\nX199 Y199 9\nX200 Y200 10\n[0070] 表格1:表A\n[0071] 示例性的表B如以下表格2所示(共10000行,在此只針對(duì)表B中的隨機(jī)兩行的處理進(jìn)行詳細(xì)說明):\n[0072] \n列B1 列B2\n... ...\n... ...\n10 Z1000\n... ...\n2 Z5000\n... ...\n[0073] 表格2:表B\n[0074] 首先在步驟300,聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器從客戶端接收數(shù)據(jù)查詢命令,該命令可以是SQL形式的。接著在步驟305,在確定所接收的SQL查詢語(yǔ)句是“連接SQL查詢語(yǔ)句”之后,服務(wù)器根據(jù)該SQL查詢語(yǔ)句生成針對(duì)表A的SQL子語(yǔ)句,其中該語(yǔ)句描述了需要在保存表A的遠(yuǎn)程數(shù)據(jù)庫(kù)上執(zhí)行的操作。\n[0075] 在步驟310,聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器決定使用本發(fā)明的方法來(lái)處理所述查詢。如上所述,存在用于執(zhí)行“連接SQL查詢語(yǔ)句”(即連接來(lái)自多個(gè)數(shù)據(jù)源的表)的多種方法。聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器的優(yōu)化器會(huì)選擇其中性能最好的一種方法。而在某些場(chǎng)景下,根據(jù)本發(fā)明的方法將具有最好的性能。例如,當(dāng)要連接的兩個(gè)表的關(guān)聯(lián)度很低的時(shí)候,優(yōu)化器能夠確定使連接操作在遠(yuǎn)程數(shù)據(jù)源上而不是在聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器上執(zhí)行。在這樣的場(chǎng)景中,根據(jù)本發(fā)明的改進(jìn)方法將具有最好效果,從而優(yōu)化器將決定使用該方法。\n[0076] 在步驟312,確定表連接的操作模式。對(duì)所述操作模式的確定基于行指針大小是否大于無(wú)關(guān)列的大小,所述無(wú)關(guān)列指的是與將在數(shù)據(jù)源2中的內(nèi)表進(jìn)行的連接操作不相關(guān)的列。如果否,則在臨時(shí)表中將使用行指針列來(lái)代替無(wú)關(guān)列,該情形可以被標(biāo)記為操作模式\n1。如果是,則臨時(shí)表中將不使用行指針列,而是使用來(lái)自數(shù)據(jù)源1的塊數(shù)據(jù)中的全部列,該情形可以被標(biāo)記為操作模式2。\n[0077] 在步驟315,計(jì)算在遠(yuǎn)程數(shù)據(jù)源2中可用于計(jì)算哈希連接或者塊嵌套循環(huán)連接的最大存儲(chǔ)器大小除以將在數(shù)據(jù)源2中建立的臨時(shí)表的最大行大小得到的最大行數(shù)以及服務(wù)器的可用本地高速緩存的最大存儲(chǔ)器大小除以所讀取的塊數(shù)據(jù)的最大行大小得到的最大行數(shù),將二者中較小的行數(shù)值確定為每次要讀取的塊數(shù)據(jù)的行數(shù),從而獲得可讀取的塊的最大行數(shù)。\n[0078] 在步驟320,基于以上確定的塊數(shù)據(jù)的行數(shù),根據(jù)所生成的SQL子語(yǔ)句,以塊讀取的方式從數(shù)據(jù)源1中檢索匹配數(shù)據(jù)。假設(shè)數(shù)據(jù)源2的高速緩存中可存儲(chǔ)數(shù)據(jù)的最大行數(shù)相對(duì)較小,其最多僅可以容納100行數(shù)據(jù),則針對(duì)表A進(jìn)行檢索所產(chǎn)生的塊數(shù)據(jù)(也是100行)如以下表格3所示,表格3的塊數(shù)據(jù)中第一列的Pn表示第n行數(shù)據(jù)在服務(wù)器的本地存儲(chǔ)器中的地址指針:\n[0079] \n列A1 列A2\nP1→ X1 Y1\nP2→ X2 Y2\n...→ ... ...\nP10→ X10 Y10\nP11→ X11 Y11\nP12→ X12 Y12\n...→ ... ...\nP20→ X20 Y20\n...→ ... ...\n...→ ... ...\nP98→ X98 Y98\nP99→ X99 Y99\nP100→ X100 Y100\n[0080] 表格3:塊數(shù)據(jù)\n[0081] 在步驟325,確定聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器采用的是操作模式1(使用行指針列)還是操作模式2(不使用行指針列)。如果是操作模式1,則聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器將在臨時(shí)表中使用行指針列來(lái)替代無(wú)關(guān)列,所述方法進(jìn)行到步驟330,將與所述連接操作相關(guān)的列以及行指針列傳送到數(shù)據(jù)源2,以用于插入在數(shù)據(jù)源2中創(chuàng)建的臨時(shí)表。如果是操作模式2,則聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器將不使用行指針列來(lái)替代無(wú)關(guān)列,所述方法進(jìn)行到步驟335,將塊數(shù)據(jù)中的所有列都傳送到數(shù)據(jù)源2,以用于插入在數(shù)據(jù)源2中創(chuàng)建的臨時(shí)表。\n[0082] 在步驟340,在遠(yuǎn)程數(shù)據(jù)源2中創(chuàng)建臨時(shí)表并將數(shù)據(jù)插入到其中。在本示例中,假定行指針大小小于無(wú)關(guān)列(A.A1、A.A2),則所述臨時(shí)表如以下表格4所示,其中臨時(shí)表中的第一列“行指針”表示每一行對(duì)應(yīng)于服務(wù)器中的塊數(shù)據(jù)的行的地址:\n[0083] \n行指針 A3\nP1 1\nP2 2\n... ...\nP10 10\nP11 1\nP12 2\n... ...\nP20 10\n... ...\n... ...\nP98 8\nP99 9\nP100 10\n[0084] 表格4:臨時(shí)表\n[0085] 在步驟345,對(duì)臨時(shí)表和數(shù)據(jù)源2中的內(nèi)表(表B)進(jìn)行連接操作。取決于數(shù)據(jù)源\n2的處理功能,所述連接可以是哈希連接或者塊嵌套循環(huán)連接。在步驟350,將連接后的結(jié)果集合返回聯(lián)合數(shù)據(jù)庫(kù)服務(wù)器150。在服務(wù)器150中返回的結(jié)果集合如以下表格5所示:\n[0086] \n行指針 A3(=B1)B2\n... ... ...\nP10 10 Z1000\nP20 10 Z1000\n... ... ...\nP100 10 Z1000\n... ... ...\nP2 2 Z5000\nP12 2 Z5000\n... ... ...\nP92 2 Z5000\n... ... ...\n[0087] 表格5:結(jié)果集合\n[0088] 表格5的結(jié)果集合只示出了對(duì)于表B中的特定兩行數(shù)據(jù)進(jìn)行連接之后所得的結(jié)果。之后,在步驟355確定是否需要在服務(wù)器上執(zhí)行從數(shù)據(jù)源2返回的結(jié)果集合與從數(shù)據(jù)源1返回的塊數(shù)據(jù)的合并。如果使用了行指針(操作模式1),則在步驟360需要通過行指針直接將具有相同行指針的中間結(jié)果列和塊數(shù)據(jù)進(jìn)行合并。如果未使用行指針(操作模式\n2),則無(wú)需進(jìn)行合并,所返回的結(jié)果集合可以被直接看作是合并表。例如,在進(jìn)行合并之后所得到的合并表如以下表格6所示:\n[0089] \nA1 A2 A3(=B1)B2\n... ... ... ...\nX10 Y10 10 Z1000\nX20 Y20 10 Z1000\n... ... ... ...\nX100 Y100 10 Z1000\n... ... ... ...\nX2 Y2 2 Z5000\nX12 Y12 2 Z5000\n... ... ... ...\nX92 Y92 2 Z5000\n... ... ...\n[0090] 表格6:合并表\n[0091] 接著在步驟365,服務(wù)器將合并表返回給客戶端。在步驟370,服務(wù)器確定數(shù)據(jù)源1的外表(表A)是否已經(jīng)檢索完畢。如果否,則所述方法返回步驟320重復(fù)執(zhí)行步驟\n320-365。如果是,則所述方法進(jìn)行到步驟375并結(jié)束。\n[0092] 根據(jù)上述假定,遠(yuǎn)程數(shù)據(jù)源2中的表B一次最多只能讀取100行數(shù)據(jù)。則讀取全部表B需要100次(即讀取100塊,共10000行)。執(zhí)行一次對(duì)表A與表B的哈希連接操作,表B只要進(jìn)行2(表A分為2塊讀取,針對(duì)每一塊,只需讀取表B一次)*100次I/O操作。而根據(jù)現(xiàn)有技術(shù)的方法,對(duì)于表B需要進(jìn)行200(針對(duì)表A的每一行,都需要遍歷表B一次)*100次I/O操作。由此可見,根據(jù)本發(fā)明的方案,在數(shù)據(jù)源1和服務(wù)器上的性能指標(biāo)基本保持不變的同時(shí),使得數(shù)據(jù)源2上的磁盤I/O操作大幅減少,從而大幅提高連接操作的性能。并且,當(dāng)表B越大,根據(jù)本發(fā)明的方法的優(yōu)勢(shì)越明顯。\n[0093] 以上通過示例并參考附圖說明了根據(jù)本發(fā)明一個(gè)實(shí)施例的用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法。在同一發(fā)明構(gòu)思下,還提出了一種根據(jù)本發(fā)明一個(gè)實(shí)施例的用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的系統(tǒng)。\n[0094] 圖4說明了一種根據(jù)本發(fā)明一個(gè)實(shí)施例的用于連接異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的系統(tǒng)400的示意性框圖。如圖4所示,系統(tǒng)400通過網(wǎng)絡(luò)與位于遠(yuǎn)程的客戶端、第一數(shù)據(jù)源、第二數(shù)據(jù)源分別進(jìn)行通信。在系統(tǒng)400中包括客戶端交互組件410、命令處理組件420、查詢優(yōu)化器430、數(shù)據(jù)源交互組件440、以及存儲(chǔ)裝置450。系統(tǒng)400例如可以是圖2所示的聯(lián)邦數(shù)據(jù)庫(kù)服務(wù)器150。\n[0095] 具體而言,客戶端交互組件410被配置用于:從客戶端接收數(shù)據(jù)查詢命令,其中所述數(shù)據(jù)查詢命令涉及來(lái)自至少兩個(gè)遠(yuǎn)程數(shù)據(jù)源(第一數(shù)據(jù)源、第二數(shù)據(jù)源)的數(shù)據(jù)。\n[0096] 命令處理組件420被配置用于:響應(yīng)于接收到數(shù)據(jù)查詢命令,根據(jù)所述數(shù)據(jù)查詢命令生成針對(duì)第一數(shù)據(jù)源的子命令。\n[0097] 數(shù)據(jù)源交互組件440被配置用于:根據(jù)所述子命令,以塊讀取的方式從所述第一數(shù)據(jù)源中檢索匹配數(shù)據(jù);將所檢索的塊數(shù)據(jù)中的至少相關(guān)列傳送到第二數(shù)據(jù)源并插入一個(gè)臨時(shí)表中,用于與第二數(shù)據(jù)源中的表進(jìn)行連接操作,其中所述相關(guān)列指的是與所述連接操作相關(guān)的列;以及從所述第二數(shù)據(jù)源接收經(jīng)過連接的結(jié)果集合。其中所述連接操作可以是哈希連接操作或者塊嵌套循環(huán)連接操作。\n[0098] 查詢優(yōu)化器430被配置用于:優(yōu)化和協(xié)調(diào)系統(tǒng)400中的各個(gè)組件的操作與交互。\n具體地,查詢優(yōu)化器430可以被配置用于:在以塊讀取的方式從所述第一數(shù)據(jù)源中檢索匹配數(shù)據(jù)之前,確定從所述第一數(shù)據(jù)源讀取的塊數(shù)據(jù)的大小。所述確定被執(zhí)行為:計(jì)算在所述第二數(shù)據(jù)源中可用于執(zhí)行連接操作的最大存儲(chǔ)器大小除以將在所述第二數(shù)據(jù)源中建立的臨時(shí)表的最大行大小得到的最大行數(shù),以及可用本地高速緩存的最大存儲(chǔ)器大小除以所讀取的塊數(shù)據(jù)的最大行大小得到的最大行數(shù);以及將二者中較小的行數(shù)值作為可讀取的塊數(shù)據(jù)的行數(shù)。查詢優(yōu)化器430還可以被配置用于:響應(yīng)于從所述第一數(shù)據(jù)源所讀取的塊數(shù)據(jù)中的無(wú)關(guān)列的大小大于行指針列,僅將所述塊數(shù)據(jù)中的相關(guān)列以及所述行指針列傳送到所述第二數(shù)據(jù)源并插入所述臨時(shí)表中,其中所述無(wú)關(guān)列指的是與將在所述第二數(shù)據(jù)源中的表進(jìn)行的連接操作不相關(guān)的列,所述行指針列唯一地標(biāo)識(shí)了來(lái)自所述第一數(shù)據(jù)源的塊數(shù)據(jù)中的各個(gè)行;以及根據(jù)所述行指針列,將從所述第二數(shù)據(jù)源接收的經(jīng)過連接的結(jié)果集合與從所述第一數(shù)據(jù)源所檢索的塊數(shù)據(jù)直接合并以形成合并表。\n[0099] 查詢優(yōu)化器430還可以被配置用于:響應(yīng)于從所述第一數(shù)據(jù)源所讀取的塊數(shù)據(jù)中的無(wú)關(guān)列的大小小于行指針列,將所述塊數(shù)據(jù)中的全部列傳送到所述第二數(shù)據(jù)源并插入所述臨時(shí)表中;以及將從所述第二數(shù)據(jù)源接收的經(jīng)過連接的結(jié)果集合直接存儲(chǔ)作為合并表。\n[0100] 存儲(chǔ)裝置450用于存儲(chǔ)從第一數(shù)據(jù)源返回的塊數(shù)據(jù)、從第二數(shù)據(jù)源返回的經(jīng)過連接的結(jié)果集合、以及將二者合并而成的合并表。\n[0101] 以上詳細(xì)描述了根據(jù)本發(fā)明一個(gè)實(shí)施例的用于連接多個(gè)異構(gòu)分布式數(shù)據(jù)庫(kù)中的表的方法和系統(tǒng)。如本領(lǐng)域普通技術(shù)人員可以了解的,本發(fā)明可以體現(xiàn)為方法、系統(tǒng)和/或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可以呈現(xiàn)為完全硬件實(shí)施形式、完全軟件實(shí)施形式或者軟件和硬件組合實(shí)施形式。此外,本發(fā)明可以被呈現(xiàn)為在機(jī)器可讀媒體上包括的計(jì)算機(jī)程序產(chǎn)品,機(jī)器可讀媒體上存儲(chǔ)了用于對(duì)計(jì)算機(jī)系統(tǒng)進(jìn)行編程以執(zhí)行根據(jù)本發(fā)明的過程的機(jī)器可執(zhí)行程序指令。這里所使用的術(shù)語(yǔ)“機(jī)器可讀媒體”包括向計(jì)算機(jī)系統(tǒng)提供用于執(zhí)行的指令的任意媒體。這種媒體可以采用多種形式,包括但是不局限于:非易失性媒體、易失性媒體和傳輸媒體。非易失性媒體的常見形式例如包括軟盤、軟磁盤、硬盤、磁帶或者任何其它磁媒體、光盤ROM(CD-ROM)或者任何其它光媒體、打孔卡或者任何其它帶有孔圖案的物理媒體、可編程ROM(PROM)、可擦寫PROM(EPROM)、電EPROM(EEPROM)、閃速存儲(chǔ)器、任何其它存儲(chǔ)芯片或者盒式磁帶(cartridge)、或者計(jì)算機(jī)系統(tǒng)可以讀取并適合存儲(chǔ)指令的任何其它媒體。\n[0102] 適于存儲(chǔ)和/或執(zhí)行程序代碼的數(shù)據(jù)處理系統(tǒng)將包括:直接地或通過系統(tǒng)總線間接地耦合于存儲(chǔ)器單元的至少一個(gè)處理器。存儲(chǔ)器單元可以包括在程序代碼的實(shí)際執(zhí)行期間使用的局部存儲(chǔ)器、海量存儲(chǔ)裝置、以及高速緩沖存儲(chǔ)器,該高速緩沖存儲(chǔ)器提供了至少某種程序代碼的臨時(shí)存儲(chǔ)以便減少在執(zhí)行期間必須從海量存儲(chǔ)裝置檢索代碼的次數(shù)。\n[0103] 此外,可以理解,方框圖和/或流程圖中的每個(gè)方框以及方框圖和流程圖中的一些方框的組合可以用一些計(jì)算機(jī)程序指令實(shí)現(xiàn)。這些計(jì)算機(jī)程序指令可以提供給一通用計(jì)算機(jī)、專用計(jì)算機(jī)或其它可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一機(jī)器,使得這些指令通過計(jì)算機(jī)或其它可編程數(shù)據(jù)處理設(shè)備的處理器的執(zhí)行創(chuàng)建用于實(shí)現(xiàn)在方框圖和/或流程圖內(nèi)或者方框內(nèi)所指定的功能的裝置。\n[0104] 盡管已經(jīng)參考優(yōu)選實(shí)施例具體地示出并描述了本發(fā)明,但其不是為了以公開的形式窮舉或限制本發(fā)明。對(duì)于本領(lǐng)域的普通技術(shù)人員,可以在形式上和細(xì)節(jié)上進(jìn)行各種改變而不會(huì)背離本發(fā)明的精神和范圍。選擇并描述了實(shí)施例是為了最好地解釋本發(fā)明的原理和實(shí)際的應(yīng)用,以及為了使本領(lǐng)域的其它普通技術(shù)人員能夠理解對(duì)于各種實(shí)施例的本發(fā)明,所述實(shí)施例具有適合于預(yù)期的具體使用的各種修改。
法律信息
- 2021-09-03
未繳年費(fèi)專利權(quán)終止
IPC(主分類): G06F 17/30
專利號(hào): ZL 200810166365.6
申請(qǐng)日: 2008.09.26
授權(quán)公告日: 2012.07.11
- 2012-07-11
- 2010-05-12
實(shí)質(zhì)審查的生效
IPC(主分類): G06F 17/30
專利申請(qǐng)?zhí)? 200810166365.6
申請(qǐng)日: 2008.09.26
- 2010-03-31
引用專利(該專利引用了哪些專利)
序號(hào) | 公開(公告)號(hào) | 公開(公告)日 | 申請(qǐng)日 | 專利名稱 | 申請(qǐng)人 |
1
| |
2005-07-27
|
2003-04-17
| | |
2
| | 暫無(wú) |
1996-10-28
| | |
3
| | 暫無(wú) |
1997-09-15
| | |
4
| |
2008-05-28
|
2007-11-13
| | |
被引用專利(該專利被哪些專利引用)
序號(hào) | 公開(公告)號(hào) | 公開(公告)日 | 申請(qǐng)日 | 專利名稱 | 申請(qǐng)人 | 該專利沒有被任何外部專利所引用! |