胡繼軍
【摘? 要】近年來(lái)統(tǒng)計(jì)數(shù)據(jù)處理程序匯總模塊執(zhí)行效率大幅提高,但靈活性還遠(yuǎn)低于用戶期望。通過(guò)對(duì)統(tǒng)計(jì)匯總表結(jié)構(gòu)的分析,發(fā)現(xiàn)它們與多維數(shù)據(jù)模型非常相似,匯總表是多維數(shù)據(jù)的平面化展示。因此,用業(yè)務(wù)數(shù)據(jù)庫(kù)的匯總數(shù)據(jù),作為基礎(chǔ)數(shù)據(jù)來(lái)構(gòu)建多維結(jié)構(gòu),經(jīng)過(guò)一定的多維操作,最后輸出平面化的統(tǒng)計(jì)匯總表。實(shí)踐表明,此方法能夠很好地滿足用戶對(duì)效率的需求,同時(shí)也能設(shè)計(jì)復(fù)雜的匯總表。
【關(guān)鍵詞】多維數(shù)據(jù)模型;統(tǒng)計(jì)數(shù)據(jù);匯總模塊
引言
統(tǒng)計(jì)數(shù)據(jù)處理程序逐漸朝平臺(tái)化方向發(fā)展。其匯總模塊的執(zhí)行效率也發(fā)生了很大變化,以地市級(jí)的數(shù)據(jù)為例,200張匯總表的執(zhí)行時(shí)間從過(guò)去的十幾個(gè)小時(shí),降到現(xiàn)在的幾個(gè)小時(shí)。雖然效率大為提高,但與用戶的實(shí)際期望值還有一定的差距。用戶希望在十幾分鐘內(nèi)完成。本文從全新的角度來(lái)分析和解決此問(wèn)題。
1.現(xiàn)有匯總模塊的主要設(shè)計(jì)思路
1.1數(shù)據(jù)庫(kù)端腳本匯總
早期一些匯總模塊使用“游標(biāo)”技術(shù)進(jìn)行數(shù)據(jù)匯總,即在數(shù)據(jù)庫(kù)端腳本中,通過(guò)游標(biāo)查詢實(shí)現(xiàn)較為復(fù)雜的匯總功能。這是因?yàn)橐恍┲小⑿⌒偷臄?shù)據(jù)庫(kù)不支持復(fù)雜的匯總功能,例如不能按地區(qū)代碼的前幾位進(jìn)行分組匯總。游標(biāo)方式雖然擴(kuò)大了匯總模塊的通用性,但它直接查詢基礎(chǔ)數(shù)據(jù),沒(méi)有利用數(shù)據(jù)庫(kù)內(nèi)置的匯總功能,執(zhí)行效率很低。
1.2分解成多個(gè)子匯總的可視化設(shè)計(jì)
近年來(lái),隨著Oracle數(shù)據(jù)庫(kù)在統(tǒng)計(jì)領(lǐng)域的廣泛使用,憑借它在行業(yè)的領(lǐng)先地位,對(duì)復(fù)雜匯總的高度支持,數(shù)據(jù)庫(kù)端腳本匯總方式逐漸退出歷史舞臺(tái)。取代的是可視化的匯總表設(shè)計(jì)。但此方法也有其缺陷,匯總表每行甚至每個(gè)單元格都是一個(gè)子匯總,結(jié)果是產(chǎn)生大量的匯總運(yùn)算,大大降低了整體匯總效率。
2.統(tǒng)計(jì)匯總表與多維數(shù)據(jù)模型的統(tǒng)一性
2.1統(tǒng)計(jì)匯總表的特點(diǎn)
匯總表包含一個(gè)或多個(gè)匯總指標(biāo),并以一個(gè)或多個(gè)分組展示數(shù)據(jù)。分組之間可以是并列關(guān)系,如先按地區(qū)分組,再按門(mén)類(lèi)分組;也可以是層次遞進(jìn)的關(guān)系,如第一層是省級(jí)分組,第二層是市級(jí)分組,即省的下面緊接著其所屬的各市。多個(gè)分組之間也可以是上面兩種方式的復(fù)雜組合。一個(gè)分組包含多個(gè)分組值,如省級(jí)分組包含各省值,分組反映匯總指標(biāo)的一類(lèi)屬性,可以理解為維(角度)。匯總指標(biāo)從不同維度表示,發(fā)現(xiàn)與多維數(shù)據(jù)模型非常相似。
2.2多維數(shù)據(jù)模型的特點(diǎn)
多維數(shù)據(jù)模型是一個(gè)邏輯概念,它主要解決如何對(duì)大量數(shù)據(jù)進(jìn)行快速查詢和多角度展示。該模型的應(yīng)用領(lǐng)域主要有數(shù)據(jù)倉(cāng)庫(kù)、OLAP(在線分析處理)和數(shù)據(jù)挖掘3個(gè)方面。它通過(guò)引入維、維分層和度量等概念,在邏輯上將數(shù)據(jù)視為一個(gè)多維立方體(簡(jiǎn)稱立方體)。
維:是人們觀察數(shù)據(jù)的特定角度,是考慮問(wèn)題時(shí)的一類(lèi)屬性,屬性值構(gòu)成維的成員。如時(shí)間維,上面的各分組即是維,也叫分組,有地區(qū)維、行業(yè)門(mén)類(lèi)維等。
維分層:同一維度還可以存在細(xì)節(jié)程度不同的多個(gè)描述層次。如時(shí)間維,可包括年、月份和日的層次,簡(jiǎn)化起見(jiàn),把維分層作為多個(gè)獨(dú)立的維。
立方體:用三維或更多的維描述一個(gè)對(duì)象,各維的成員交叉點(diǎn)(坐標(biāo)點(diǎn))保存對(duì)象的數(shù)值數(shù)據(jù)。在數(shù)據(jù)匯總中,交叉點(diǎn)保存的是匯總指標(biāo),可以不止一個(gè)。
度量:立方體中各維的成員交叉點(diǎn),是一個(gè)單元格,用以存放1個(gè)或多個(gè)數(shù)值數(shù)據(jù),這些數(shù)據(jù)就是度量,單元格則是度量的容器。
通過(guò)比較統(tǒng)計(jì)匯總表和多維數(shù)據(jù)模型的特點(diǎn),發(fā)現(xiàn)它們是可以互相轉(zhuǎn)換的,都是描述多維結(jié)構(gòu)的數(shù)據(jù),是視圖與模型的關(guān)系。
3.設(shè)計(jì)特色的多維匯總模塊
3.1選擇合適的多維數(shù)據(jù)模型
既然多維數(shù)據(jù)模型與統(tǒng)計(jì)匯總表能夠達(dá)到如此高度的統(tǒng)一,那它便是匯總模塊優(yōu)先的選擇。多維數(shù)據(jù)模型的實(shí)現(xiàn)有多種途徑,其中主要有多維數(shù)據(jù)庫(kù)、關(guān)系型數(shù)據(jù)庫(kù)以及兩者相結(jié)合的復(fù)合方式。用于匯總的細(xì)節(jié)數(shù)據(jù)已經(jīng)存在于業(yè)務(wù)數(shù)據(jù)庫(kù)中,而匯總表一般都比較復(fù)雜,如有可能要對(duì)分組值進(jìn)行歸并,匯總表里也可能包含多個(gè)數(shù)據(jù)匯總,這就要求我們建立起自己的多維結(jié)構(gòu)來(lái)處理這些問(wèn)題。因此,多維數(shù)據(jù)模型是多維與關(guān)系型相結(jié)合的第三種方式。
3.2設(shè)計(jì)自定義的多維結(jié)構(gòu)
從上面的分析來(lái)看,多維匯總模塊需要設(shè)計(jì)自定義的多維結(jié)構(gòu)。套用多維數(shù)據(jù)模型中的概念,一次從業(yè)務(wù)數(shù)據(jù)庫(kù)返回的匯總數(shù)據(jù),都應(yīng)創(chuàng)建一個(gè)相應(yīng)的立方體。由于統(tǒng)計(jì)匯總表往往包含多個(gè)數(shù)據(jù)匯總,因此多維結(jié)構(gòu)也應(yīng)包含多個(gè)立方體。
在實(shí)踐中,考慮到匯總表有主欄和賓欄之分,多維結(jié)構(gòu)也應(yīng)把分組維分成主欄維和賓欄維兩部分。為了方便統(tǒng)一處理,把匯總指標(biāo)看作一個(gè)特殊的維,叫度量維。度量維的成員與各匯總指標(biāo)名稱一一對(duì)應(yīng)。這樣每一個(gè)匯總指標(biāo)的具體值都有其唯一的維坐標(biāo),這為后續(xù)的多維操作奠定了基礎(chǔ)。
3.3需要定義的多維操作
(1)立方體的合并。如果匯總表包含多個(gè)立方體,這時(shí)合并操作是必需的。常用的合并操作是加操作,即在兩個(gè)立方體中,對(duì)于相同的維坐標(biāo),如果都有匯總數(shù)據(jù),則其和作為此坐標(biāo)上的新值;如果只有一個(gè),則此值就是新值;否則為空。合并操作也可以是減操作、最大值操作等。
(2)維成員的排序。排序方式有:無(wú)排序、升序和降序,還可以提供自定義的排序。一般情況下,根據(jù)基本匯總數(shù)據(jù)創(chuàng)建的立方體,其各維的成員是有序的。但如果它是合并生成的,維成員的有序一般會(huì)打破,就需要重新排序。排序時(shí)應(yīng)考慮成員“合計(jì)”的特殊性,因?yàn)楹嫌?jì)一般放在最前面(或最后面),如果作為普通的成員處理,有可能排在中間。
(3)維成員的操作。其主要有維成員的增加、刪除和合并。在地區(qū)分組中,有時(shí)需要 “直轄區(qū)”一欄,但直轄區(qū)在行政區(qū)劃中沒(méi)有對(duì)應(yīng)的級(jí)別,它是部分子地區(qū)的合計(jì)。常規(guī)的辦法是針對(duì)直轄區(qū)再匯總一次。如果支持增加操作,則第二次的匯總就可省略,這大大提高了效率。合并操作實(shí)際上是先增加產(chǎn)生新成員,后刪除對(duì)應(yīng)的原始成員,這在業(yè)務(wù)數(shù)據(jù)庫(kù)不支持復(fù)雜的分組匯總時(shí),特別有用。
3.4其他方面的設(shè)計(jì)
有了核心的多維結(jié)構(gòu),其他方面的設(shè)計(jì)就容易多了,這里只作簡(jiǎn)單的介紹。對(duì)于具體的匯總應(yīng)用,模塊首先需要定義數(shù)據(jù)源、匯總的分組以及匯總指標(biāo)。數(shù)據(jù)源是匯總的數(shù)據(jù)來(lái)源,也是業(yè)務(wù)數(shù)據(jù)庫(kù)中的一個(gè)或多個(gè)數(shù)據(jù)表。XML文件是定義匯總表的最佳選擇,一個(gè)文件可以定義多個(gè)基本匯總,還可以定義這些匯總的合并方式。每個(gè)匯總的定義又包含主欄分組、賓欄分組和匯總指標(biāo)的定義。
#號(hào)開(kāi)始的是全局變量或者前面定義的局部變量,首先定義的是匯總字段定義HS1,即度量維,接著定義業(yè)務(wù)數(shù)據(jù)庫(kù)需匯總的數(shù)據(jù),模塊則根據(jù)返回的數(shù)據(jù),在系統(tǒng)中建立名為“主立方體”的立方體,立方體中定義了兩個(gè)分組。配置文件可以手動(dòng)編寫(xiě),也可以開(kāi)發(fā)可視化的匯總表設(shè)計(jì)。
4.多維匯總模塊的執(zhí)行效率及優(yōu)化
本匯總模塊已經(jīng)用于臺(tái)州市第三次經(jīng)濟(jì)普查的簡(jiǎn)要本和資料本匯總,以及第二次R&D資源清查的匯總開(kāi)發(fā)。普查的簡(jiǎn)要本包含200余張匯總表,匯總時(shí)間約為70秒;普查資料本包含400余張匯總表,匯總的時(shí)間約為150秒。從上面數(shù)據(jù)可知,本模塊的匯總效率遠(yuǎn)遠(yuǎn)高于10分鐘200張的要求。前面的數(shù)據(jù)是在單線程中計(jì)算的,如果在多線程下,速度將提升至少一倍。
本模塊能取得目前的效率,主要取決于兩個(gè)方面:一是不從業(yè)務(wù)數(shù)據(jù)庫(kù)中直接查詢細(xì)節(jié)數(shù)據(jù),而是利用業(yè)務(wù)數(shù)據(jù)庫(kù)的匯總數(shù)據(jù)建立多維結(jié)構(gòu)。這既能避免大量基礎(chǔ)數(shù)據(jù)的傳輸,又能利用業(yè)務(wù)數(shù)據(jù)庫(kù)內(nèi)部匯總的高效優(yōu)點(diǎn);二是盡量減少對(duì)業(yè)務(wù)數(shù)據(jù)庫(kù)的匯總次數(shù)。如不要把匯總分成過(guò)多的子匯總,多使用多維操作減少匯總的次數(shù)。