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