專利名稱:數(shù)據(jù)庫大數(shù)據(jù)量表存儲和查詢方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機(jī)應(yīng)用技術(shù)領(lǐng)域,具體地說是一種數(shù)據(jù)庫大數(shù)據(jù)量表存儲和査詢的實現(xiàn) 方法。
背景技術(shù):
在很多企業(yè)的業(yè)務(wù)系統(tǒng)中都存在"日清日結(jié)"或者"日清月結(jié)"的功能,這樣會方便企 業(yè)對當(dāng)天或者整個月商品的庫存以及銷售情況進(jìn)行盤點;在這一過程中, 一般會生成大量的 數(shù)據(jù)記錄來存儲到數(shù)據(jù)庫相應(yīng)的日結(jié)帳表中,隨著時間的累積,這樣的表會越來越龐大,在 一些相對集中的企業(yè)數(shù)據(jù)庫中數(shù)量級會達(dá)到億級以上。在數(shù)據(jù)庫中如果存在記錄數(shù)上億的表,會給數(shù)據(jù)的查詢帶來比較大的麻煩,除了査詢SQL 本身的響應(yīng)時間會越來越慢,主機(jī)系統(tǒng)在CPU、內(nèi)存資源的使用上也會越來越高,更嚴(yán)重的 是會使跟這些表相關(guān)的業(yè)務(wù)功能無法進(jìn)行,在并發(fā)要求比較高的數(shù)據(jù)庫系統(tǒng)中,可能會給系 統(tǒng)帶來大量的數(shù)據(jù)庫鎖,并影響整個數(shù)據(jù)庫系統(tǒng),導(dǎo)致數(shù)據(jù)庫的崩潰;而對于表空間存在大 小限制的數(shù)據(jù)庫,龐大數(shù)據(jù)量的表也是一個比較棘手的問題。在解決大數(shù)據(jù)量表存儲問題方面,比較常用的方式是在經(jīng)過一段時間之后,對表中的數(shù) 據(jù)進(jìn)行轉(zhuǎn)移,也就是從最初的表中將數(shù)據(jù)遷移到另一個或多個存儲歷史過渡數(shù)據(jù)的表中,也 有直接將歷史數(shù)據(jù)清除的做法;這兩種做法都存在一定問題,將數(shù)據(jù)隔一段時間轉(zhuǎn)移到歷史 過渡表中, 一方面需要考慮歷史過渡表怎么維護(hù)的問題,在轉(zhuǎn)移數(shù)據(jù)上也需要花費很多精力, 另外就是對于歷史過渡數(shù)據(jù)的査詢比較麻煩,査詢性能也不會很好;如果將數(shù)據(jù)直接清空也 將面臨歷史數(shù)據(jù)査詢的問題。上面的方式多數(shù)時候都不具備自動維護(hù)的特點,都是在維護(hù)人 員人工操作的情況下進(jìn)行的。發(fā)明內(nèi)容本發(fā)明的數(shù)據(jù)庫大數(shù)據(jù)量表存儲和査詢方法,是根據(jù)企業(yè)中大數(shù)據(jù)量的表特性進(jìn)行分區(qū) 規(guī)則設(shè)計,通過設(shè)計好的分區(qū)規(guī)則,實現(xiàn)數(shù)據(jù)庫表的邏輯設(shè)計和物理設(shè)計,從而實現(xiàn)大數(shù)據(jù) 量表的分區(qū)存儲以及分區(qū)查詢的目的,具體實現(xiàn)步驟如下1) 企業(yè)中日結(jié)帳表按照月份分區(qū)規(guī)則設(shè)計,日結(jié)帳表都存在日期列,而且對于日結(jié)帳表 的査詢方式是一個完整的月份,分區(qū)規(guī)則按照月份來制定;2) 在定義好分區(qū)規(guī)則之后,對于表定義按照分區(qū)規(guī)則劃分成多份,按月份的劃分定義成 12個表,每個表都定義有特定的表空間,數(shù)據(jù)存儲在不同特定的表空間中;3) 在定義好的表的基礎(chǔ)上,增加表檢査約束定義,約束條件為月份,通過檢查約束實現(xiàn) 記錄增加的時候自動存儲到不同表空間中;4) 分區(qū)表的定義完成之后,定義聯(lián)合視圖,通過聯(lián)合視圖聯(lián)合所有分區(qū)表實現(xiàn)大數(shù)據(jù)量 日結(jié)帳表的分區(qū)存儲;5) 通過修改聯(lián)合視圖的定義,讓每個分區(qū)表都增加相應(yīng)的査詢條件,這樣就實現(xiàn)了分區(qū) 查詢的目的。利用通用數(shù)據(jù)庫定義以及設(shè)計規(guī)則來實現(xiàn)數(shù)據(jù)庫表分區(qū)存儲以及分區(qū)査詢的目的,不依 賴于任何數(shù)據(jù)庫深層次的技術(shù)。 本發(fā)明的有益效果是1、 通過企業(yè)中大數(shù)據(jù)量表的一些特性,來實現(xiàn)表的邏輯分區(qū)設(shè)計,從而實現(xiàn)大數(shù)據(jù)量表 物理上的分區(qū)實現(xiàn)。2、 采用一些通用的數(shù)據(jù)庫定義方法來解決大數(shù)據(jù)量表的分區(qū)實現(xiàn)問題,而不依賴數(shù)據(jù)庫 是否具備分區(qū)技術(shù),大多數(shù)數(shù)據(jù)庫產(chǎn)品都能夠?qū)崿F(xiàn)。3、 不需要花太多精力考慮數(shù)據(jù)存儲維護(hù)的問題,表空間的限制相當(dāng)于擴(kuò)大到原來的12 倍,避免了數(shù)據(jù)庫表空間維護(hù)給系統(tǒng)運維人員帶來的麻煩。4、 解決數(shù)據(jù)庫大數(shù)據(jù)量表的査詢SQL的響應(yīng)時間隨時間增長變得越來越慢的問題,在這 種實現(xiàn)效果下,12年之后才會相當(dāng)于原方式1年之后的查詢響應(yīng)時間。5、 整個實現(xiàn)方式對于客戶端工具和程序來說,相當(dāng)于一個"黑盒子",不需要開發(fā)人員 做什么調(diào)整,在以后的維護(hù)當(dāng)中也不需要系統(tǒng)維護(hù)人員做人工的干預(yù)。
附圖1是數(shù)據(jù)庫大數(shù)據(jù)量表存儲和査詢的方法流程結(jié)構(gòu)示意圖。
具體實施方式
本發(fā)明的方法是是通過合理的分區(qū)規(guī)則來解決大數(shù)據(jù)量表的問題;不需要維護(hù)人員做過 多的維護(hù)工作,更不需要定期進(jìn)行歷史數(shù)據(jù)的遷移工作。企業(yè)中的日結(jié)帳表一般都是根據(jù)特定算法,來記錄當(dāng)天商品的銷售、庫存等財務(wù)報表數(shù) 據(jù)的情況;匯總的目的一方面企業(yè)需要知道當(dāng)天銷售過程中的成本以及獲得的利潤情況,另 一方面一些具體的人員,例如客戶經(jīng)理需要及時了解每個客戶的當(dāng)天的訂貨情況;這種日結(jié) 帳表除了能夠提供某一天或者某一段時間的報表査詢數(shù)據(jù)之外,還將作為月結(jié)算的原始數(shù)據(jù), 那么這樣來看日結(jié)帳表對系統(tǒng)來說真正有意義的都是不超過一個完整月份的數(shù)據(jù)。這樣我們 就可以根據(jù)這個規(guī)則對日結(jié)賬表進(jìn)行按月分區(qū)實現(xiàn),實現(xiàn)分區(qū)之后日結(jié)帳表對應(yīng)12個表。具體實現(xiàn)的技術(shù)方案如下,假設(shè)某企業(yè)中存在一個客戶商品日賬表(SD一ITEM—CUST_DAY),該表是用來存儲每天該企業(yè)的所有客尸定購商品情況的,我們現(xiàn)在想象一下在一個擁有龐大 客戶群的企業(yè),比如擁有20萬個客戶,而每個客戶每天至少定購IO種商品,這樣算下來這 個表一天增加的記錄是200萬條,如果在一年當(dāng)中把一些假期去掉,按剩下200天算,那一 年下來這個表中存儲的記錄為4億條記錄,這是相當(dāng)龐大的一個數(shù)字?,F(xiàn)在我們看這個表原 來的定義CREATE TABLE 〃SD—ITEM—CUST—DAY〃 ( "COM—ID"職C賺 30) NOT亂L , "SALEORG—ID" VARCHAR(30) NOT NULL , "DATE1〃 CHAR(8) NOT NULL , 〃CUST—ID" VARCHAR(30) NOT NULL , "SLSMAN—ID" VARCHAR(30) NOT NULL WITH DEFAULT '0', "ITEM—ID" VARCHAR(30) NOT NULL , 〃QTY—SOLD" DECIMAL(18, 2) WITH DEFAULT 0 , "AMT—SOLD—WITH—TAX" DECIMAL(18,2) WITH DEFAULT 0) IN 〃MTA—QUERY";首先將該表邏輯定義上按月份劃分成12個表,例如SD—TTEM—CUST—DAYOl、 SD—ITEM—CUST—DAY02...CREATE TABLE 〃SD—ITEM—CUST—DAYOl〃 ( 〃COM—ID〃 VARCHAR(30) NOT NULL , "SALEORG—ID"職C腿(30) NOT NULL , 〃MTE1〃 CHAR (8) NOT NULL , "CUST—ID" VARCHAR(30) NOT NULL , "SLSMAN—ID" VARCHAR (30) NOT NULL WITH DEFAULT '0', "ITEM—ID" VARCHAR(30) NOT NULL , 〃QTY—SOLD" DECIMAL(18,2) WITH DEFAULT 0 , "AMT—SOLD—WITH_TAX" DECIMAL(18,2) WITH DEFAULT 0)IN "DATA—QUERY";在定義劃分好之后需要解決兩方面問題,分別是分區(qū)存儲和分區(qū)查詢?nèi)绾螌崿F(xiàn)的問題。 針對分區(qū)存儲實現(xiàn)的問題,可以進(jìn)一步細(xì)分為兩個問題, 一是如何將物理存儲按照月份實現(xiàn) 自動存儲,二是如何對客戶端或者程序員來說操作這12個表仍然跟"分區(qū)"之前沒有區(qū)別, 這樣客戶端的工具及程序就不用去做任何的調(diào)整。為了解決分區(qū)存儲的第一個問題,我們在定義這12個表的時候每個表都指定了一個特定 的表空間,另外特別增加一個特定的檢査約束,檢查約束的目的是保證表存儲的時候按照我們所設(shè)想的每個月的數(shù)據(jù)存儲在特定月份的表中。實現(xiàn)如下CREATE TABLE 〃SD—ITEM—CUST—DAYOl"( 〃COM—ID"窗C腿(30) NOT NULL , "SALEORG—ID" VARCHAR(30) NOT NULL , 〃DATE1〃 CHAR(8) NOT NULL ,"CUST_ID〃 VARCHAR(30) NOT NULL ,〃SLSMAN—ID" VARCHAR(30) NOT NULL WITH DEFAULT ' 0'"ITEM—ID" VARCHAR(30) NOT NULL ,〃QTY—SOLD" DECIMAL(18,2) WITH DEFAULT 0 ,"AMT—SOLD—WITH—TAX" DECIMAL(18,2) WITH DEFAULT 0)IN "DATA—QUERYOl":ALTER TABLE 〃SD—ITEM—CUST—DAY01" ADD CONSTRAINT "ITEMCUSTDAYCHECK01" CHECK (S區(qū)TR(DATEl, 5,2) = ' 01');為了解決分區(qū)存儲的第二個問題我們需要將這12個表創(chuàng)建成一個視圖,通過聯(lián)合定義使12個表對客戶端及程序員表現(xiàn)為一個表,實現(xiàn)如下 CREATE VIEW SD—ITEM—CUST—DAY ASSELECTFROMSD__ITEM——CUST_—DAY01UNIONALLSELECT*FROMSD——ITEM—-CUST-匿DAY02麗ONALLSELECT*FROMSD_—ITEM——CUST—匿DAY03UNIONALLSELECTFROMSD—_ITEM——CUST——DAY04UNIONALLSELECT*FROMSD_—ITEM——CUST-匿DAY05UNIONALLSELECT氺FROMSD_—ITEM畫-CUST-—DAY06UNIONALLSELECT*FROMSD_—ITEM——CUST-—DAY07UNIONALLSELECTF國SD_—ITEM一—CUST—_DAY08UNIONALLSELECT*FROMSD畫—ITEM—一CUST-畫DAY09UNIONALLSELECT氺FROMSD畫-ITEM--CUST——DAY10UNIONALLSELECT求FROMSD—-ITEM-—CUST—_DAY11UNIONALLSELECT*FROMSD——ITEM_—CUST__DAY12);在分區(qū)存儲的問題解決之后,我們面臨的是査詢性能問題,因為我們不僅需要解決存儲表空間數(shù)據(jù)量大的問題,還要解決在査詢上分區(qū)之后的性能明顯比分區(qū)之前好的問題。假使我們現(xiàn)在有一個査詢SQL: select CUST—ID, ITEM—ID, SUM (QTY—SOLD) f rom SD—ITEM—CUST—DAY where DATE1=' 20080908',如果按照上面的聯(lián)合視圖的方式去査詢,最終的結(jié)果會是下面 12條SQL的査詢結(jié)果的一個聯(lián)合結(jié)果集,select. CUST—ID, ITEM_ID, SUM (QTY—SOLD)fromSD—-ITEVLCUST—DAY01whereDATE1:'20080908'selectCUST_ID, ITEM_ID,SUM(QTY—SOLD)fromSD—_ITEM_CUST—DAY02whereDATE1=,20080908'selectCUST_ID, ITEM—ID,SUM(QTY_SOLD)fromSD——ITEM—CUST—DAY03whereDATE1=,20080908'selectCUST—ID, ITEM_ID,SUM(QTY_SOLD)fromSD_—ITEM—CUST_DAY04whereDATE1='20080908'selectCUST一ID,ITEM_ID,SlM(QTY_SOLD)fromSD-.ITEM_CUST_DAY05whereDATE1=,20080908'selectCUST—ID,ITEM_ID,SUM(QTY_SOLD)fromSD--ITEM—CUST_DAY06whereDATE1='20080908'selectCUST_ID, ITEM一ID,SUM(QTY一SOLD)fromSD——ITEM—CUST—DAY07whereDATE1=,20080908'selectCUST—ID, ITEM—ID,SUM(QTY_SOLD)fromSD—_ITEM—CUST—DAY08DATEl:'20080908'selectCUST—ID, ITEM—ID,SUM(QTY—SOLD)fromSD-—ITEM—CUST—DAY09whereDATE1=,20080908'selectCUST_ID,ITEM_ID,SUM(QTY—SOLD)fromSD-.ITEM—CUST_DAY10DATE1=,20080908'selectCUST_ID, ITEM—ID,SUM(QTY_SOLD)fromSD——ITEM—CUST—DAY11DATE1=,20080908'select CUST—ID, ITEM—ID, SUM(QTY—SOLD) from SD—ITEM—CUST—DAY12 whereDATE1=, 20080908';這并不是我們想要的結(jié)果,這樣的查詢效率肯定很差,而且會比"分區(qū)"之前更差。我 們實現(xiàn)的目的是想讓這個SQL只會去查詢SD—ITEM_CUST—DAY09 —個表,即執(zhí)行下面SQL:select CUST—ID, ITEM—ID, SUM(QTY—SOLD) from SD—ITEM—CUST—DAY09 where MTE1=, 20080908';為了實現(xiàn)這樣的效果我們將原來SD_ITEM—CUST—DAY這個聯(lián)合視圖的定義重新調(diào)整一下, 實現(xiàn)方式如下-CREATE VIEW SD—ITEM—CUST—DAY AS(SELECT*FROMSD—_ITEM—CUST—_DAY01冊EREDATEl >='20080101'ANDDATEl<='20080131'UNION ALLSELECT*FROMSD-—ITEM—CUST——DAY02WHEREDATE1>='20080201'ANDDATEl<='20080231'UN訓(xùn)ALLSELECT求F,SD-—ITEM_CUST—-DAY03冊EREDATEl 〉='20080301'ANDDATEl<='20080331'UNION ALLSELECT*F,SD—_ITEM_CUST_—DAY04WHEREDATE1>='20080401'ANDDATEl<='20080431'隨ON ALLSELECT*FROMSD—_ITEM—CUST——DAY05冊EREDATE1>=,20080501'ANDDATEl<='20080531'UNION ALLSELECTFROMSD--ITEM—CUST-—DAY06WHEREDATEl >='20080601'ANDDATEl<='20080631'UNION ALLSELECT承FROMSD—_ITEM_CUST——DAY07WHEREDATEl >='20080701'ANDDATEl<='20080731'UNION ALLSELECT求FROMSD—-ITEM_CUST——DAY08冊EREDATE1>='20080801'ANDDATEl<='20080831'UNION MXSELECT*FROMSD_—ITEM—CUST——MY09冊EREDATEl >='20080901'ANDDATEl<='20080931'UN腦ALLSELECT*FROMSD畫_ITEM—CUST--DAY10冊EREDATE1〉=,20081001'AND隨E1<='20081031'UNION ALLSELECT*FROMSD__ITEM—CUST-—DAYll冊EREDATEl 〉='20081101'ANDDATEl<='20081131'UNION ALLSELECT * FROM SD_ITEM_CUST—DAY12 WHERE DATE1〉='20081201' AND DATEl <= '20081231'); 做上面修改之后,fe們^實現(xiàn)了分區(qū)査詢的效果。
權(quán)利要求
1.數(shù)據(jù)庫大數(shù)據(jù)量表存儲和查詢的方法,其特征在于,根據(jù)企業(yè)中大數(shù)據(jù)量的表特性進(jìn)行分區(qū)規(guī)則設(shè)計,通過設(shè)計好的分區(qū)規(guī)則,實現(xiàn)數(shù)據(jù)庫表的邏輯設(shè)計和物理設(shè)計,從而實現(xiàn)大數(shù)據(jù)量表的分區(qū)存儲以及分區(qū)查詢的目的,具體實現(xiàn)步驟如下1)企業(yè)中日結(jié)帳表按照月份分區(qū)規(guī)則設(shè)計,日結(jié)帳表都存在日期列,而且對于日結(jié)帳表的查詢方式是一個完整的月份,分區(qū)規(guī)則按照月份來制定;2)在定義好分區(qū)規(guī)則之后,對于表定義按照分區(qū)規(guī)則劃分成多份,按月份的劃分定義成12個表,每個表都定義有特定的表空間,數(shù)據(jù)存儲在不同特定的表空間中;3)在定義好的表的基礎(chǔ)上,增加表檢查約束定義,約束條件為月份,通過檢查約束實現(xiàn)記錄增加的時候自動存儲到不同表空間中;4)分區(qū)表的定義完成之后,定義聯(lián)合視圖,通過聯(lián)合視圖聯(lián)合所有分區(qū)表實現(xiàn)大數(shù)據(jù)量日結(jié)帳表的分區(qū)存儲;5)通過修改聯(lián)合視圖的定義,讓每個分區(qū)表都增加相應(yīng)的查詢條件,這樣就實現(xiàn)了分區(qū)查詢的目的。
2、根據(jù)權(quán)利要求1所述的方法,其特征在于利用通用數(shù)據(jù)庫定義以及設(shè)計規(guī)則來實現(xiàn)數(shù) 據(jù)庫表分區(qū)存儲以及分區(qū)查詢的目的,不依賴于任何數(shù)據(jù)庫深層次的技術(shù)。
全文摘要
本發(fā)明提供一種數(shù)據(jù)庫大數(shù)據(jù)量表存儲和查詢方法,該方法通過數(shù)據(jù)庫物理設(shè)計和邏輯設(shè)計來實現(xiàn)海量數(shù)據(jù)表的存儲“分區(qū)”,而不依賴于數(shù)據(jù)庫本身是否具備分區(qū)技術(shù);該方法根據(jù)日結(jié)帳表所特有的一些特性設(shè)計合理的規(guī)則,根據(jù)規(guī)則來對表定義進(jìn)行“分區(qū)”設(shè)計,使記錄在向數(shù)據(jù)庫插入過程中自動“分發(fā)”到不同存儲“分區(qū)”中;“分區(qū)”之后的日結(jié)帳表根據(jù)規(guī)則設(shè)計來創(chuàng)建聯(lián)合視圖,通過聯(lián)合視圖提供查詢功能,這樣實現(xiàn)的日結(jié)帳表在數(shù)據(jù)查詢上會有明顯的優(yōu)勢,而對于表空間存在大小限制的數(shù)據(jù)庫,也不會因為日結(jié)帳表數(shù)據(jù)量龐大而導(dǎo)致數(shù)據(jù)庫表空間達(dá)到上限而無法解決。
文檔編號G06Q10/00GK101404013SQ20081015978
公開日2009年4月8日 申請日期2008年11月13日 優(yōu)先權(quán)日2008年11月13日
發(fā)明者宋智強(qiáng) 申請人:山東浪潮齊魯軟件產(chǎn)業(yè)股份有限公司