一種針對多數(shù)據(jù)庫表的跨庫分頁查詢方法
【技術領域】
[0001]本發(fā)明屬于數(shù)據(jù)查詢技術領域,涉及針對多數(shù)據(jù)庫表的跨庫分頁查詢方法。
【背景技術】
[0002]隨著大數(shù)據(jù)時代的來臨,針對海量數(shù)據(jù)的查詢越來越不容易,其查詢的效率也備受:關注。
[0003]以銀行業(yè)金融行業(yè)為例,隨著銀行卡產(chǎn)業(yè)的高速發(fā)展,每日的跨行交易總量已經(jīng)突破了三千萬筆,傳統(tǒng)一個數(shù)據(jù)庫單張表的方式,已經(jīng)遠遠不能滿足數(shù)據(jù)庫運維的需求,拆分數(shù)據(jù)庫表和拆分數(shù)據(jù)庫是必然的選擇。因此,各種交易數(shù)據(jù)會以多個數(shù)據(jù)庫、每個數(shù)據(jù)庫對應多張數(shù)據(jù)庫表的形式來存儲。
[0004]目前針對多張位于不同數(shù)據(jù)庫的數(shù)據(jù)庫表的查詢中,比較通用方法的有以下幾種。
[0005]第一種,為多張數(shù)據(jù)庫表創(chuàng)建視圖,通過訪問視圖來達到對多張數(shù)據(jù)庫表的訪問。針對每張數(shù)據(jù)庫表數(shù)據(jù)量不是特別大、表不是特別多情況,創(chuàng)建視圖是一種簡單可行的方案。但是在每張數(shù)據(jù)庫表的數(shù)據(jù)量比較大且數(shù)據(jù)庫表張數(shù)比較多的情況(例如:每張表數(shù)據(jù)量超過3千萬,366張數(shù)據(jù)表)下,即使創(chuàng)建了索引,通過視圖訪問也會效率十分低下,甚至出現(xiàn)不可訪問的情況。
[0006]第二中,通過創(chuàng)建nickname (昵稱)的方式,將跨數(shù)據(jù)庫查詢轉(zhuǎn)換成單庫查詢。采用nickname后,不能完全實現(xiàn)數(shù)據(jù)庫之間相互獨立,存在潛在的安全隱患。在銀行、金融等對數(shù)據(jù)安全要求比較高的行業(yè),已經(jīng)禁止采用nickname。即使在安全性要求較低的數(shù)據(jù)查詢領域采用nickname,也只能解決跨庫訪問的問題,仍然面臨數(shù)據(jù)庫表張數(shù)過多的問題。
[0007]有鑒于此,有必要提出一種新型的針對多數(shù)據(jù)庫表的跨庫查詢方法。
【發(fā)明內(nèi)容】
[0008]本發(fā)明的目的在于,提高多數(shù)據(jù)庫表跨庫查詢的查詢效率。
[0009]為實現(xiàn)以上目的或者其他目的,本發(fā)明提供以下技術方案。
[0010]按照本發(fā)明的一方面,提供一種數(shù)據(jù)分頁查詢方法,其中,每頁查詢記錄的輸出對應一次查詢,對M個數(shù)據(jù)庫中的N張數(shù)據(jù)庫表進行數(shù)據(jù)查詢的指令對應至少一頁查詢,其中M和N為整數(shù),M彡2,N彡M,每個數(shù)據(jù)庫至少對應一張數(shù)據(jù)庫表;
所述數(shù)據(jù)分頁查詢方法包括以下步驟:
接收到需要對M個數(shù)據(jù)庫中的N張數(shù)據(jù)庫表進行數(shù)據(jù)查詢的所述指令;
判斷在緩存中是否存儲有對應該指令的反映查詢記錄情況的統(tǒng)計信息,從而判斷該指令在緩存的數(shù)據(jù)存儲周期內(nèi)是否是第一次接收;
如果緩存中沒有存儲所述統(tǒng)計信息,執(zhí)行以下步驟:
S110,將該指令按查詢?nèi)蝿詹鸱譃镕個子任務,每個子任務對應一個數(shù)據(jù)庫的一張或多張數(shù)據(jù)庫表的查詢,其中F為整數(shù),N^F^M; S120,并行地執(zhí)行F個子任務;
S130,在執(zhí)行完成后返回所有F個子任務對應的查詢記錄的總的條數(shù)G,并返回第一前Q條查詢記錄,其中,Q為分頁查詢時每頁輸出的查詢記錄的條數(shù),G^Q;
S140,生成所述統(tǒng)計信息并將該統(tǒng)計信息存儲至所述緩存,所述統(tǒng)計信息包括每個子任務對應的查詢記錄的條數(shù);
S150,將第一前Q條查詢記錄輸出以輸出第一頁查詢結(jié)果;
如果緩存中存儲有所述統(tǒng)計信息,執(zhí)行以下步驟:
S210,根據(jù)所述統(tǒng)計信息獲知預計的查詢記錄對應的一個或多個子任務;
S220,并行執(zhí)行所述F個子任務中的該一個或多個子任務;
S230,返回第二前Q條查詢記錄并將該Q條查詢記錄按一頁查詢結(jié)果輸出。
[0011]按照本發(fā)明一實施例的數(shù)據(jù)分頁查詢方法,其中,所述第一或第二前Q條查詢記錄為對應于多個子任務所返回的查詢記錄時,合并該多個子任務所返回的查詢記錄。
[0012]按照本發(fā)明還一實施例的數(shù)據(jù)分頁查詢方法,其中,基于所述總的條數(shù)G以及每頁輸出的查詢記錄的條數(shù)Q,如果G大于Q,則返回所述接收步驟,并在所述判斷步驟中判斷為緩存中存儲有所述統(tǒng)計信息,以重復執(zhí)行所述步驟S210至S230,從而總共輸出K頁查詢結(jié)果,其中K為將G除以Q的結(jié)果向上取整得到的整數(shù)。
[0013]在之前所述任一實施例中,優(yōu)選地,所述指令為SQL指令,所述SQL指令按消息摘要算法5 (MD5)處理以得出其MD5摘要信息。
[0014]在之前所述任一實施例中,具體地,所述統(tǒng)計信息被表述為以下格式:
<MD5(SQL), ?SplitO, F1), <Splitl, F2>,…,〈Split (F_l),F(xiàn)f>) > ;
其中,MD5(SQL)為SQL指令的MD5摘要信息,SplitO至Split (F-1)依次表示拆分形成的第一子任務至第F子任務,F1至Ff依次表示第一子任務至第F子任務分別所對應的查詢記錄的條數(shù)。
[0015]在之前所述任一實施例中,優(yōu)選地,在所述判斷步驟,根據(jù)接收的SQL指令的MD5摘要信息與統(tǒng)計信息中的MD5摘要信息是否向?qū)獊砼袛嗍欠翊鎯τ袑揝QL指令的反映查詢記錄的統(tǒng)計信息。
[0016]在之前所述任一實施例中,優(yōu)選地,所述緩存的數(shù)據(jù)存儲周期不超過一天。
[0017]在之前所述任一實施例中,優(yōu)選地,F(xiàn)=M,每個子任務對應一個數(shù)據(jù)庫的一張或多張數(shù)據(jù)庫表的查詢。
[0018]按照本發(fā)明的又一方面,提供一種數(shù)據(jù)分頁查詢裝置,其中,每頁查詢記錄的輸出對應一次查詢,對M個數(shù)據(jù)庫中的N張數(shù)據(jù)庫表進行數(shù)據(jù)查詢的指令對應至少一頁查詢,其中M和N為整數(shù),M彡2,N彡M,每個數(shù)據(jù)庫至少對應一張數(shù)據(jù)庫表;
所述數(shù)據(jù)分頁查詢裝置包括以下部件:
指令接收部件,用于接收到需要對M個數(shù)據(jù)庫中的N張數(shù)據(jù)庫表進行數(shù)據(jù)查詢的所述指令;
統(tǒng)計信息判斷部件,用于判斷在緩存中是否存儲有對應該指令的反映查詢記錄情況的統(tǒng)計信息,從而判斷該指令在緩存的數(shù)據(jù)存儲周期內(nèi)是否是第一次接收;
第一部件,在緩存中沒有存儲所述統(tǒng)計信息的情況下用于執(zhí)行以下步驟:
S110,將該指令按查詢?nèi)蝿詹鸱譃镕個子任務,每個子任務對應一個數(shù)據(jù)庫的一張或多張數(shù)據(jù)庫表的查詢,其中F為整數(shù),N^F^M;
S120,并行地執(zhí)行F個子任務;
S130,在執(zhí)行完成后返回所有F個子任務對應的查詢記錄的總的條數(shù)G,并返回第一前Q條查詢記錄,其中,Q為分頁查詢時每頁輸出的查詢記錄的條數(shù),G^Q;
S140,生成所述統(tǒng)計信息并將該統(tǒng)計信息存儲至所述緩存,所述統(tǒng)計信息包括每個子任務對應的查詢記錄的條數(shù);
S150,將第一前Q條查詢記錄輸出以輸出第一頁查詢結(jié)果;
第二部件,在緩存中存儲有所述統(tǒng)計信息的情況下用于執(zhí)行以下步驟:
S210,根據(jù)所述統(tǒng)計信息獲知預計的查詢記錄對應的一個或多個子任務;
S220,并行執(zhí)行所述F個子任務中的該一個或多個子任務;
S230,返回第二前Q條查詢記錄并將該Q條查詢記錄按一頁查詢結(jié)果輸出。
[0019]按照本發(fā)明一實施例的數(shù)據(jù)分頁查詢裝置,其中,所述第一或第二前Q條查詢記錄為對應于多個子任務所返回的查詢記錄時,合并該多個子任務所返回的查詢記錄
本發(fā)明的技術效果是,通過將查詢?nèi)蝿詹鸱植⑿胁樵?,并將反映查詢記錄情況的統(tǒng)計信息在緩存中存儲,因此,在跨庫分頁查詢時,其后針對該查詢指令的某頁的查詢可以實現(xiàn)定位查詢,最大限度地減少對數(shù)據(jù)庫的訪問,大大提高分頁查詢的效率,適用于多數(shù)據(jù)庫表的跨庫分頁查詢。并且,數(shù)據(jù)庫之間在查詢過程中也相互獨立,能保證跨庫查詢的安全性。該數(shù)據(jù)分頁查詢方法通用性強,適用于多種數(shù)據(jù)庫場景查詢。
【附圖說明】
[0020