專利名稱:多表連接方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)倉庫中的多表連接技術(shù)領(lǐng)域,特別是涉及一種按照時(shí)間壓縮的多表連接方法,以提高多表連接的效率。
背景技術(shù):
數(shù)據(jù)倉庫的一個重要特點(diǎn)是需要對大量歷史數(shù)據(jù)進(jìn)行存儲。一種常見的情況是多目的數(shù)據(jù)相同,簡單地對這些記錄進(jìn)行存儲將造成存儲空間極大的浪費(fèi)。一種常用的改進(jìn)方法是對這些記錄按照時(shí)間段進(jìn)行壓縮存儲,通過在事實(shí)表與維表中加上有效開始日期(Effective_From)和有效結(jié)束日期(Effective_To)兩個字段表示記錄的時(shí)間有效性。這樣,一段時(shí)間內(nèi)相同記錄可以壓縮為一條記錄,這種方法可以充分利用存儲空間。數(shù)據(jù)倉庫之父W.H.Inmon和數(shù)據(jù)倉庫專家Ralph Kimball都在各自的專著中對這種方法進(jìn)行了介紹。但是,這種常用的壓縮方法同時(shí)也給多表連接操作帶來了復(fù)雜性,因?yàn)閭鹘y(tǒng)的索引和表連接方式都不能完全發(fā)揮作用。因此,如何快速而高效地實(shí)現(xiàn)這種按時(shí)間段壓縮的多表的連接操作成為了一個常見的問題。
為了更清晰地闡述這類問題,下面針對圖6(A)~6(C)所示的三張表來進(jìn)行描述。在圖6(A)所示的表,例如T1是常見的事實(shí)表,其中SK字段表示代理鍵,A字段表示一個數(shù)量(可能是交易數(shù)量或其他數(shù)量),有效開始日期,有效結(jié)束日期,其中“1900-01-01”表示一個最小的日期,“9999-12-31”表示一個最大的日期。類似地,圖6(B)所示的表,例如T2,是常見的維表,其中SK字段表示代理鍵,B字段表示某個屬性信息(可能是信用卡編號或其他信息),有效開始日期和有效結(jié)束日期兩個字段的含義與如上所述相同。將表T1和表T2按照有效期時(shí)間段關(guān)系進(jìn)行連接后生成的正確結(jié)果表T3,如圖6(C)所示。
對于這種類型的多表連接操作,一種最原始的方法是首先“解壓”記錄,即將按照時(shí)間段存儲的一條記錄變?yōu)榘慈盏挠涗?,其中的?shù)量全部相同,例如對于一條時(shí)間段為5月1日至5月31日的時(shí)間壓縮記錄,按日進(jìn)行解壓后將生成31條記錄,這些記錄除了日期字段其余所有字段都相同,然后對事實(shí)表與維表按照SK與日期進(jìn)行合并,最后將結(jié)果表重新按照時(shí)間段進(jìn)行壓縮存儲。這種最簡單的方法在效率上十分低下,并且在三個步驟的合并過程中將耗費(fèi)許多存儲空間供臨時(shí)表使用。
其他一些方法是根據(jù)時(shí)間段合并的不同條件采用SQL語句實(shí)現(xiàn),在這方面,IBM,NCR等公司都給出了他們建議的SQL語句方式,效率比上述的原始方法有較大提高,在數(shù)據(jù)倉庫項(xiàng)目中一般都采用這種SQL語句的方式解決此類連接問題。但是這種目前普遍采用的方法仍然存在著兩個主要的缺點(diǎn)。
1.SQL語句方式的執(zhí)行效率不高對于SQL語句的效率從算法理論角度分析如下用SQL語句進(jìn)行兩表的連接操作,其基礎(chǔ)建立在對兩表做笛卡爾積。如果兩表分別有M,N條記錄,則需要對M×N條記錄進(jìn)行處理,算法復(fù)雜性為O(M×N)。
根據(jù)更一般的情況可以得到如下分析過程假設(shè)T1表中不同SK的取值有M種,每一種SK的取值分別有Ni條記錄(即第i個SK有Ni條記錄,i=1,2,3……M)。
假設(shè)T2表中不同SK的取值有P種,每一種SK的取值分別有Qi條記錄(即第i個SK有Qi條記錄,i=1,2,3……P)。
則對于SQL實(shí)現(xiàn)的笛卡爾積有如下分析連接條件為T1.SK=T2.SK,則連接后形成的結(jié)果表共有 條記錄,其中s為N與Q中相同SK的數(shù)目。
但是,如果考慮索引的因素,可以進(jìn)一步得到如下的分析過程
對T1表和T2表作為連接條件的字段SK,EF,ET分別加上索引,這樣SQL語句在實(shí)際執(zhí)行過程中每次讀取T1表中一條記錄,然后在T2表中進(jìn)行查找,由于采用了索引,因此不必順序查找整個表,而是在一定的排序算法基礎(chǔ)上根據(jù)查找算法進(jìn)行查找,根據(jù)算法理論證明可知,查找算法效率最高是log2N,其中N是記錄條數(shù),經(jīng)過我們對oracle環(huán)境中SQL語句的查詢計(jì)劃分析,oracle環(huán)境中對索引表的查找效率即為log2N。
為了分析的簡潔起見,在這里假設(shè)T1表中只有一個SK,取值有M條記錄,T2中有同樣對應(yīng)的一個SK,取值有N條記錄,可以看到,將M看作T1表中不同SK對應(yīng)記錄數(shù)的平均值,將N看作T2表中不同SK對應(yīng)記錄數(shù)的平均值,根據(jù)上述假設(shè),SQL方式訪問表的次數(shù)為M×log2N+M,當(dāng)M,N很大時(shí),這樣的操作仍然需要耗費(fèi)比較長的時(shí)間。
此外,現(xiàn)代關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMSRelation DataBaseManagement System)對于表連接SQL語句主要采用的是在笛卡爾積基礎(chǔ)上發(fā)展而來的嵌套循環(huán)連接(Nested Loop Join)、排序合并連接(Sort Merge Join)以及哈希連接(Hash Join)以及基于這些方法的改進(jìn)算法。
但是,由于此類問題存在的按照時(shí)間段進(jìn)行連接的特殊性,使得這些普遍采用的算法在此類問題上仍然不能完全發(fā)揮作用。在實(shí)際數(shù)據(jù)庫管理系統(tǒng)所采用的三種表連接算法中,嵌套循環(huán)連接方式基本與笛卡爾積操作一樣,不同的是實(shí)際采用時(shí)對于數(shù)據(jù)的I/O操作進(jìn)行了一定的優(yōu)化,但是表連接的基本操作記錄比較的數(shù)目是不變的。
排序合并連接雖然對于一般的表連接可以達(dá)到O(M+N)的效率,但是其前提條件是作為連接條件的字段值是表內(nèi)唯一的并且連接條件為等值連接時(shí)才能達(dá)到這個最優(yōu)的效率。如果連接條件字段值不唯一或者連接條件為不等值連接,那么效率將大大下降,這被國外研究者稱為排序合并連接算法的本質(zhì)缺陷(Intrinsic Skew)。針對這些由于數(shù)據(jù)問題引起的排序連接算法效率下降問題,很多研究者都進(jìn)行了研究,但是提出的改進(jìn)算法主要著重于在比較指針需要回溯的時(shí)候如何減少數(shù)據(jù)庫的讀寫次數(shù),目前還沒有一種算法能大幅減少記錄比較次數(shù),使得效率回到O(M+N)這個最佳值。
哈希連接依賴于所選擇的哈希函數(shù),目前還沒有一種能使得各種表連接情況都能達(dá)到最優(yōu)效率的哈希函數(shù)。另外,哈希連接的實(shí)現(xiàn)比較復(fù)雜,在很大程度上依賴于具體的數(shù)據(jù)庫管理系統(tǒng)。對于一些比較輕型的數(shù)據(jù)庫管理系統(tǒng)可能沒有哈希連接,那么多表連接就很難得到優(yōu)化。
2.SQL語句對于邊界值情況處理時(shí)會造成記錄丟失SQL方法對于事實(shí)表和維表每個SK第一條記錄的處理會丟失一段時(shí)間,例如對于圖6(A)和圖6(B)的表中所示的數(shù)據(jù),對于SK=1的記錄,使用SQL語句得到的結(jié)果表中第一條記錄如圖7的表所示。從圖7中可以看出,丟失了從1999-01-01到1999-04-30這段時(shí)間的信息,也就是說對于圖6(A)中的第一條記錄的信息造成了丟失,而丟失記錄在數(shù)據(jù)倉庫中絕對不允許的。SQL語句方式為了解決這種邊界值的丟失,必須加入額外的語句進(jìn)行判別和處理。
發(fā)明內(nèi)容
本發(fā)明克服了現(xiàn)有技術(shù)中的不足,提供一種形式簡潔,與具體平臺和編程語言無關(guān),對數(shù)據(jù)倉庫領(lǐng)域中按時(shí)間壓縮存儲的多表連接具有普遍適用性,執(zhí)行效率提高明顯的時(shí)間壓縮的多表連接方法。
在本發(fā)明的一個方面,提出了一種將具有多條記錄的第一表與具有多條記錄的第二表連接以形成第三表的多表連接方法,所述第一表和第二表的每一條記錄都具有各自的有效開始日期、有效結(jié)束日期、第一數(shù)量和/或第二數(shù)量,所述的方法包括步驟第一步驟,初始化分別用來暫存第一數(shù)量和第二數(shù)量的第一數(shù)量變量和第二數(shù)量變量,以及分別用來暫存第一表的記錄和第二表的記錄的第一記錄變量和第二記錄變量;第二步驟,將第一表的一條記錄和第二表的一條記錄分別讀入第一記錄變量和第二記錄變量;第三步驟,將第一記錄變量的有效開始日期和第二記錄變量的有效開始日期中較小的有效開始日期作為第三表中一條記錄的有效開始日期,并將較小有效開始日期所在的記錄中的第一數(shù)量和第二數(shù)量的一個作為第三表的該條記錄的第一數(shù)量和第二數(shù)量中的一個,將第一數(shù)量變量和第二數(shù)量變量之一中的數(shù)量作為第三表中該條記錄的第二數(shù)量;第四步驟,如果第一表和第二表中有效開始日期小的那個表中有未處理的記錄,則將該表的第一數(shù)量或第二數(shù)量保存到第一數(shù)量變量和第二數(shù)量變量,以及將第一表的下一條記錄或者第二表的下一條記錄存儲到第一記錄變量或者第二記錄變量,并保持第一記錄變量和第二記錄變量中有效開始時(shí)間大的那個記錄變量不變;以及第五步驟,如果第一表和第二表中有效開始時(shí)間小的那個表中沒有未處理的記錄,則將第一表和第二表的另一表中的所有記錄順序輸入到第三表。
根據(jù)本發(fā)明的一個實(shí)施例,在所述第三步驟,如果第一表中該條記錄的有效開始日期等于第二表中該條記錄的有效開始日期,則將兩個表中相應(yīng)記錄的任意一個有效開始日期作為第三表中該條記錄的有效開始日期,并且第三表的該條記錄的第一數(shù)量和第二數(shù)量取當(dāng)前的第一記錄變量的第一數(shù)量和第二記錄變量的第二數(shù)量。
根據(jù)本發(fā)明的一個實(shí)施例,在所述第三步驟,如果輸出到第三表的記錄不是第一條,則將當(dāng)前輸出的有效開始日期的前一天作為第三表中的前一條記錄的有效結(jié)束時(shí)間。
根據(jù)本發(fā)明的一個實(shí)施例,在所述第四步驟,如果第一記錄變量的有效開始時(shí)間等于第二記錄變量的有效開始時(shí)間,則保存當(dāng)前的第一數(shù)量和第二數(shù)量到第一數(shù)量變量和第二數(shù)量變量,以及從第一表和第二表中讀取下一條記錄到第一記錄變量和第二記錄變量,執(zhí)行第三步驟。
根據(jù)本發(fā)明的一個實(shí)施例,所述第一表是事實(shí)表,所述第二表是維表。
根據(jù)本發(fā)明的一個實(shí)施例,所述第一表和第二表中的記錄是按照主鍵排序的。
根據(jù)本發(fā)明的一個實(shí)施例,所述第一表和第二表中的記錄是按照代理鍵、有效開始日期、有效結(jié)束日期升序排序的。
根據(jù)本發(fā)明的一個實(shí)施例,所述第一數(shù)量是交易數(shù)量,所述第二數(shù)量是信用卡編號。
利用本發(fā)明的方案,表連接的執(zhí)行效率比SQL語句方式有著很大的提高,并且不會造成邊界值的丟失。
圖1是根據(jù)本發(fā)明實(shí)施例的多表連接方法的流程圖;圖2是在根據(jù)本發(fā)明實(shí)施例的多表連接方法的執(zhí)行過程中使用的數(shù)據(jù)表的示意圖;圖3示出了用來說明本發(fā)明的方法的原理所采用的抽象表結(jié)構(gòu)的示意圖;圖4示出了根據(jù)本發(fā)明的多表連接方法的執(zhí)行效率與現(xiàn)有技術(shù)之間的比較;圖5示出了根據(jù)本發(fā)明實(shí)施例的多表連接方法對邊界值的修正結(jié)果;圖6(A)、6(B)和6(C)分別示出了用來說明現(xiàn)有技術(shù)的事實(shí)表T1、維表T2和結(jié)果表T3;圖7示出了用來說明SQL方法造成的邊界值丟失的問題的表。
具體實(shí)施例方式
下面對照附圖詳細(xì)說明本發(fā)明的具體實(shí)施例。
原理圖3示出了用來說明本發(fā)明的方法的原理所采用的抽象表結(jié)構(gòu)的示意圖。如圖3所示的表結(jié)構(gòu)是上述問題的一個抽象,基于這個表結(jié)構(gòu)討論可以很容易地推廣到此類問題的具體表結(jié)構(gòu)中。
在圖3中,表T1和T2表示連接操作的兩個源表,T3表示連接后的結(jié)果表,表T1中SK表示代理健,A表示某個數(shù)值,EF表示有效開始日期,ET表示有效結(jié)束日期,表T2中B表示某個數(shù)值,其他三個字段含義與表T1中的一致。這里假設(shè)表T1和T2都已經(jīng)按照SK(代理鍵),EF(有效開始日期),ET(有效結(jié)束日期)升序排序完畢,這個前提在實(shí)際中是很容易滿足的。
根據(jù)本發(fā)明實(shí)施例的多表連接方法利用此類問題根據(jù)時(shí)間段作為連接條件的特點(diǎn),只需要對兩表各掃描一次就可以得到結(jié)果,也就是說當(dāng)兩表記錄數(shù)分別是M,N時(shí),總共只需要處理M+N條記錄。
根據(jù)時(shí)間段連接的前提是兩記錄鍵值相同。但是,由于兩表已經(jīng)按照主鍵有序,因此如果兩記錄鍵值不相同,那么直接輸出即可。為了清晰描述本發(fā)明的方法,下面假設(shè)兩表待比較的記錄SK相同,根據(jù)時(shí)間段關(guān)系進(jìn)行比較。鑒于時(shí)間壓縮的數(shù)據(jù)倉庫加載方式,該前提條件是一定在此類應(yīng)用中自然滿足的,因此這個假設(shè)不影響本方法的可推廣性以及后續(xù)對于方法效率的分析。
本發(fā)明的多表連接方法的原理如下所述。
第一步驟,初始化變量PreA,PreB保存前一次輸出的A,B值。初始化變量Tmp1,Tmp2保存T1,T2當(dāng)前處理的記錄。
第二步驟,讀入T1,T2兩條記錄到Tmp1,Tmp2。
第三步驟,比較Tmp1的EF和Tmp2的EF,輸出較小的EF值作為T3.EF,T3的A或B取較小的EF值所對應(yīng)記錄的變量值(A或B),另一個變量取保存變量PreA或PreB。如果T1.EF=T2.EF,則輸出任意EF值作為T3.EF,T3中的A,B取當(dāng)前Tmp1,Tmp2的A,B。如果輸出的不是T3的第一條記錄,則取當(dāng)前輸出的EF減1作為T3中前一條記錄的ET。
第四步驟,如果較小EF的來源表有未處理記錄,則保存當(dāng)前A或B到PreA或PreB,讀入下一條記錄到Tmp1或Tmp2,較大的EF所對應(yīng)的Tmp1或Tmp2保持不變。如果Tmp1的EF等于Tmp2的EF,則保存當(dāng)前A,B到PreA,PreB,兩表都讀入下一條記錄至Tmp1和Tmp2,回到第三步驟。
第五步驟,如果較小EF的來源表中沒有未處理記錄,則順序輸出另一張表中所有記錄到T3,T3中的另一個變量取PreA或PreB,然后結(jié)束。
例子下面將對照附圖,對本發(fā)明的技術(shù)方案進(jìn)行詳細(xì)說明。圖1是根據(jù)本發(fā)明實(shí)施例的多表連接方法的流程圖。圖2是在根據(jù)本發(fā)明實(shí)施例的多表連接方法的執(zhí)行過程中使用的數(shù)據(jù)表的示意圖。
步驟101方法開始。
步驟102初始化變量PreA,PreB,Tmp1,Tmp2,其中變量PreA用于保存上一次處理的A,PreB用于保存上一次處理的B,Tmp1用于保存T1當(dāng)前處理的記錄,Tmp2用于保存T2當(dāng)前處理的記錄。
步驟103讀入T1的第一條記錄到Tmp1,T2的第一條記錄到Tmp2。
步驟104判斷Tmp1.EF是否大于Tmp2.EF。
步驟105當(dāng)步驟104中判斷結(jié)果為“是”,即Tmp1.EF>Temp2.EF時(shí),輸出Tmp2.EF作為T3.EF,Tmp2.B作為T3.B,PreA作為T3.A。如果不是T3第一條記錄,則輸出當(dāng)前的Tmp2.EF-1作為T3上一條記錄的ET,保存Tmp2.B到PreB。
步驟106判斷T2表是否還有未處理過的記錄。
步驟107當(dāng)步驟106中判斷結(jié)果為“是”,即T2中還有未處理過的記錄,則讀入T2的下一條記錄到Tmp2,同時(shí)保持Tmp1不變,并轉(zhuǎn)至步驟104。
步驟108當(dāng)步驟106中判斷結(jié)果為“否”,即T2中沒有未處理過的記錄,則輸出T1中剩余的記錄到T3,將T1.EF作為T3.EF,T1.A作為T3.A,PreB作為T3.B,轉(zhuǎn)至步驟121,方法結(jié)束。
步驟109當(dāng)步驟104中判斷結(jié)果為“否”,即Tmp1.EF<=Temp2.EF時(shí),判斷Tmp1.EF是否小于Tmp2.EF。
步驟110當(dāng)步驟109中判斷結(jié)果為“是”,即Tmp1.EF<Tmp2.EF時(shí),輸出Tmp1.EF作為T3.EF,Tmp1.A作為T3.A,PreB作為T3.B,如果不是T3第一條記錄,則輸出當(dāng)前的Tmp1.EF-1作為T3上一條記錄的ET,保存Tmp1.A到PreA。
步驟111判斷T1表是否還有未處理過的記錄。
步驟112當(dāng)步驟111中判斷結(jié)果為“是”,即T1中還有未處理過的記錄,則讀入T1的下一條記錄到Tmp1,同時(shí)保持Tmp2不變,并轉(zhuǎn)至步驟104。
步驟113當(dāng)步驟111中判斷結(jié)果為“否”,即T1中沒有未處理過的記錄,則輸出T2中剩余的記錄到T3,將T2.EF作為T3.EF,T2.B作為T3.B,PreA作為T3.A,并轉(zhuǎn)至步驟121,方法結(jié)束。
步驟114當(dāng)步驟109中判斷結(jié)果為“否”,即Tmp1.EF=Tmp2.EF時(shí),輸出Tmp1.EF作為T3.EF,Tmp1.A作為T3.A,Tmp2.B作為T3.B,如果不是T3第一條記錄,則輸出當(dāng)前的Tmp1.EF-1作為T3上一條記錄的ET,保存Tmp1.A到PreA,保存Tmp2.B到PreB。
步驟115判斷T1表是否還有沒有處理過的記錄。
步驟116當(dāng)步驟115中判斷結(jié)果為“否”,即T1中沒有未處理過的記錄,則輸出T2中剩余的記錄到T3,將T2.EF作為T3.EF,T2.B作為T3.B,PreA作為T3.A,轉(zhuǎn)至步驟121,方法結(jié)束。
步驟117當(dāng)步驟115中判斷結(jié)果為“是”,即T1中還有沒有處理過的記錄,則讀入T1的下一條記錄到Tmp1,同時(shí)保持Tmp2不變。
步驟118判斷T2表是否還有沒有處理過的記錄。
步驟119當(dāng)步驟118中判斷結(jié)果為“否”,即T2中沒有未處理過的記錄,則輸出T1中剩余的記錄到T3,將T1.EF作為T3.EF,T1.A作為T3.A,PreB作為T3.B,轉(zhuǎn)至步驟121,方法結(jié)束。
步驟120當(dāng)步驟118中判斷結(jié)果為“是”,即T2中還有沒有處理過的記錄,則讀入T2的下一條記錄到Tmp2,同時(shí)保持Tmp1不變。轉(zhuǎn)至步驟104。
步驟121方法結(jié)束。
為了對上述方法描述有一個更直觀的認(rèn)識,圖2是針對表T1和T2數(shù)據(jù)所給出的方法執(zhí)行過程例子,由于SK=1與SK=2記錄執(zhí)行過程一致,因此圖2中只給出了SK=1的記錄的執(zhí)行情況。圖中標(biāo)號1至6顯示了每一次對記錄操作的過程。圖2的左面顯示了4個變量的取值變化情況,箭頭右邊代表了每次的輸出結(jié)果。因?yàn)楸?,表2中SK=1的記錄各有三條,因此總共需要執(zhí)行6步就能得到最終的結(jié)果。
比較通過上面的描述,可以看出本發(fā)明的多表連接方法的執(zhí)行效率比SQL語句方式有著很大的提高(因?yàn)榈谝环N原始的解壓縮處理方式的效率顯然沒有SQL語句高,因此不將TCJ方法與該方法進(jìn)行比較)。
首先,本發(fā)明的方法充分利用了兩表根據(jù)時(shí)間段進(jìn)行合并的這個前提條件,只需對兩表遍歷一次就可以得到結(jié)果。因此只需要對M+N條記錄進(jìn)行處理,本發(fā)明方法的復(fù)雜性為O(M+N),與SQL方式相比具有明顯的優(yōu)勢。
與背景技術(shù)部分中對于SQL方法效率的分析相對應(yīng),對于本發(fā)明的方法根據(jù)更一般的情況可以得到如下分析過程。
假設(shè)事實(shí)表中不同SK的取值有M種,每一種SK的取值分別有Ni條記錄(即第i個SK有Ni條記錄,i=1,2,3……M)。
假設(shè)維表中不同SK的取值有P種,每一種SK的取值分別有Qi條記錄(即第i個SK有Qi條記錄,i=1,2,3……P)。
這樣,本發(fā)明的方法連接后形成的結(jié)果表共有 條記錄,其中s為N與Q中相同SK的數(shù)目。
則TCJ方法與SQL方法的效率之比為 為了簡化上式,取N’,Q’分別表示Ni,Qi的平均值,則上式可簡化為S(N′×Q′)S(N′+Q′)=N′×Q′N′+Q′,]]>而一般情況下事實(shí)表N’值遠(yuǎn)大于維表Q’值,則上式可進(jìn)一步簡化為N′×Q′N′=Q′.]]>而如果考慮索引的因素,從背景技術(shù)部分中的分析可以看到SQL方法訪問表的次數(shù)約為 而本發(fā)明方法訪問表的次數(shù)為M+N,兩者效率之比為 當(dāng)N=1時(shí),log2N取到最小值為0,則效率之比為 一般情況下M>>1,則兩者效率值比約等于1,說明當(dāng)維表中每個SK下只有一條記錄時(shí),兩種方法效率相等。如果有M>>N,則上式可簡化為M×log2N+MM=M(log2N+1)M=log2N+1,]]>說明當(dāng)采用了索引進(jìn)行優(yōu)化后,SQL方式的效率有所提高,但是本發(fā)明的方法仍然可以比SQL方式提高log2N+1倍。
實(shí)驗(yàn)采用了SAS V8.2實(shí)現(xiàn)了本發(fā)明的方法,在Intel P42.8GHZ,512MB RAM,Windows 2000Professional環(huán)境中運(yùn)行,與SQL語句方式進(jìn)行了比較,SQL語句采用的是對所有SQL實(shí)現(xiàn)方式經(jīng)過分析后得到的最簡潔高效的一種selecta.sk,a.A,b.B,max(a.ef,b.ef,&MIN_DATE)as ef,min(a.et,b.et,&MAX_DATE)as etfrom t1 as aleft join t2 as bon(a.sk=b.sk)and(a.ef<=b.et and a.et>=b.ef);實(shí)驗(yàn)結(jié)果如圖4所示的數(shù)據(jù)表。從圖4的表中可以看到,本發(fā)明的方法的執(zhí)行速度比SQL語句提高了3倍至45倍,提高的倍數(shù)與維表中每個SK對應(yīng)的記錄數(shù)成正比關(guān)系。
此外,使用SQL語句方式得到的結(jié)果在每個SK的第一條記錄會造成丟失,而本發(fā)明的方法能得到正確結(jié)果。例如對于圖6(A)和圖6(B)所示的表T1和T2中的數(shù)據(jù),對于SK=1的記錄,使用SQL語句得到的結(jié)果表中第一條記錄如圖7所示。相反,使用本發(fā)明的方法得到的正確結(jié)果如圖5所示。因此,本發(fā)明的方法完全可以消除SQL方法造成的邊界值丟失問題。
以上所述,僅為本發(fā)明中的具體實(shí)施方式
,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉該技術(shù)的人在本發(fā)明所披露的技術(shù)范圍內(nèi),可輕易想到的變換或替換,都應(yīng)涵蓋在本發(fā)明的包含范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)該以權(quán)利要求書的保護(hù)范圍為準(zhǔn)。
權(quán)利要求
1.一種將具有多條記錄的第一表與具有多條記錄的第二表連接以形成第三表的多表連接方法,所述第一表和第二表的每一條記錄都具有各自的有效開始日期、有效結(jié)束日期、第一數(shù)量和/或第二數(shù)量,所述的方法包括步驟第一步驟,初始化分別用來暫存第一數(shù)量和第二數(shù)量的第一數(shù)量變量和第二數(shù)量變量,以及分別用來暫存第一表的記錄和第二表的記錄的第一記錄變量和第二記錄變量;第二步驟,將第一表的一條記錄和第二表的一條記錄分別讀入第一記錄變量和第二記錄變量;第三步驟,將第一記錄變量的有效開始日期和第二記錄變量的有效開始日期中較小的有效開始日期作為第三表中一條記錄的有效開始日期,并將較小有效開始日期所在的記錄中的第一數(shù)量和第二數(shù)量的一個作為第三表的該條記錄的第一數(shù)量和第二數(shù)量中的一個,將第一數(shù)量變量和第二數(shù)量變量之一中的數(shù)量作為第三表中該條記錄的第二數(shù)量;第四步驟,如果第一表和第二表中有效開始日期小的那個表中有未處理的記錄,則將該表的第一數(shù)量或第二數(shù)量保存到第一數(shù)量變量和第二數(shù)量變量,以及將第一表的下一條記錄或者第二表的下一條記錄存儲到第一記錄變量或者第二記錄變量,并保持第一記錄變量和第二記錄變量中有效開始時(shí)間大的那個記錄變量不變;以及第五步驟,如果第一表和第二表中有效開始時(shí)間小的那個表中沒有未處理的記錄,則將第一表和第二表的另一表中的所有記錄順序輸入到第三表。
2.如權(quán)利要求1所述的多表連接方法,其特征在于,在所述第三步驟,如果第一表中該條記錄的有效開始日期等于第二表中該條記錄的有效開始日期,則將兩個表中相應(yīng)記錄的任意一個有效開始日期作為第三表中該條記錄的有效開始日期,并且第三表的該條記錄的第一數(shù)量和第二數(shù)量取當(dāng)前的第一記錄變量的第一數(shù)量和第二記錄變量的第二數(shù)量。
3.如權(quán)利要求1所述的多表連接方法,其特征在于,在所述第三步驟,如果輸出到第三表的記錄不是第一條,則將當(dāng)前輸出的有效開始日期的前一天作為第三表中的前一條記錄的有效結(jié)束時(shí)間。
4.如權(quán)利要求1所述的多表連接方法,其特征在于,在所述第四步驟,如果第一記錄變量的有效開始時(shí)間等于第二記錄變量的有效開始時(shí)間,則保存當(dāng)前的第一數(shù)量和第二數(shù)量到第一數(shù)量變量和第二數(shù)量變量,以及從第一表和第二表中讀取下一條記錄到第一記錄變量和第二記錄變量,執(zhí)行第三步驟。
5.如權(quán)利要求2~4之一所述的多表連接方法,其特征在于,所述第一表是事實(shí)表,所述第二表是維表。
6.如權(quán)利要求5所述的多表連接方法,其特征在于,所述第一表和第二表中的記錄是按照主鍵排序的。
7.如權(quán)利要求5所述的多表連接方法,其特征在于,所述第一表和第二表中的記錄是按照代理鍵、有效開始日期、有效結(jié)束日期升序排序的。
8.如權(quán)利要求5所述的多表連接方法,其特征在于,所述第一數(shù)量是交易數(shù)量,所述第二數(shù)量是信用卡編號。
全文摘要
公開了一種將具有多條記錄的第一表與具有多條記錄的第二表連接以形成第三表的多表連接方法,所述第一表和第二表的每一條記錄都具有各自的有效開始日期、有效結(jié)束日期、第一數(shù)量和/或第二數(shù)量。本發(fā)明的方法充分利用了兩表根據(jù)時(shí)間段進(jìn)行合并的這個前提條件,只需對兩表遍歷一次就可以得到結(jié)果。因此,只需要對M+N條記錄進(jìn)行處理,就能夠?qū)蓚€表連接成一個表,并且克服了SQL方法造成的邊界值丟失問題。
文檔編號G06F17/30GK1808431SQ20051013591
公開日2006年7月26日 申請日期2005年12月31日 優(yōu)先權(quán)日2005年12月31日
發(fā)明者張昀, 李翔, 劉承巖 申請人:中國工商銀行股份有限公司