



摘 要:商務(wù)數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)中,數(shù)據(jù)分析人員對(duì)數(shù)據(jù)倉(cāng)庫(kù)的抽取查詢?cè)絹?lái)越頻繁。使用什么樣的技術(shù)來(lái)提高數(shù)據(jù)倉(cāng)庫(kù)的查詢速度以及維護(hù)數(shù)據(jù)倉(cāng)庫(kù)是一個(gè)重大技術(shù)問(wèn)題。本文提出匯總delta表的概念,將數(shù)據(jù)的改變劃分為增值和更新兩個(gè)階段,縮短了以往在更新數(shù)據(jù)時(shí)數(shù)據(jù)倉(cāng)庫(kù)鎖定的時(shí)間,提高了查詢效率。同時(shí),通過(guò)數(shù)據(jù)立方體的構(gòu)建,更直觀的呈現(xiàn)出數(shù)據(jù)分析模型。
關(guān) 鍵 詞:數(shù)據(jù)倉(cāng)庫(kù);匯總delta表;數(shù)據(jù)立方體;OLAP
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
1 引言
隨著計(jì)算機(jī)應(yīng)用技術(shù)和信息技術(shù)的不斷深入和發(fā)展,各種應(yīng)用軟件的普及,應(yīng)用系統(tǒng)中的數(shù)據(jù)也隨著日常工作而迅速增長(zhǎng),數(shù)據(jù)庫(kù)系統(tǒng)和數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)正越來(lái)越多的走進(jìn)人們的日常生活中,成為工作中不可或缺的一部分[1]。在確保查詢結(jié)果準(zhǔn)確無(wú)誤的同時(shí),人們更關(guān)心查詢效率和查詢維護(hù)的問(wèn)題。影響查詢效率的因素有很多,諸如CPU的處理能力、計(jì)算機(jī)內(nèi)存大小、I/O速度、存儲(chǔ)硬盤的容量、采取何種底層操作系統(tǒng)和數(shù)據(jù)庫(kù)管理系統(tǒng)等。
其中,數(shù)據(jù)庫(kù)管理系統(tǒng)逐漸成為管理信息系統(tǒng)的重要組成部分,各種基于數(shù)據(jù)庫(kù)的聯(lián)機(jī)事務(wù)處理(OLTP, On-Line Transaction Processing)和聯(lián)機(jī)分析處理(OLAP, On-Line Analysis Processing)正慢慢的轉(zhuǎn)變成為計(jì)算機(jī)應(yīng)用的核心。同時(shí),OLTP和OLAP的功能和數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)的結(jié)合形成了一個(gè)完整的數(shù)據(jù)查詢分析以及維護(hù)的全方位系統(tǒng)。
數(shù)據(jù)倉(cāng)庫(kù)是決策支持系統(tǒng)(DSS, Decision Support System)和聯(lián)機(jī)分析應(yīng)用數(shù)據(jù)源的結(jié)構(gòu)化數(shù)據(jù)環(huán)境,其研究和解決從數(shù)據(jù)庫(kù)中獲取信息的問(wèn)題。數(shù)據(jù)倉(cāng)庫(kù)之父William H. Inmon在出版的《Building the Data Warehouse》一書中指出,數(shù)據(jù)倉(cāng)庫(kù)是一個(gè)面向主題的、集成的、相對(duì)穩(wěn)定的、反映歷史變化的數(shù)據(jù)集合,用于支持管理決策[2]。
數(shù)據(jù)倉(cāng)庫(kù)的出現(xiàn),進(jìn)一步拓展了數(shù)據(jù)庫(kù)系統(tǒng),使得大容量的歷史數(shù)據(jù)分析成為可能。然而無(wú)論是在前期數(shù)據(jù)抽取,還是之后的轉(zhuǎn)換、加載以及維護(hù)過(guò)程中,傳統(tǒng)的方法都有一定的局限性,并且效率不高。因此,如何實(shí)現(xiàn)對(duì)數(shù)據(jù)倉(cāng)庫(kù)的高效維護(hù)成為熱點(diǎn)問(wèn)題。
2 匯總表和數(shù)據(jù)立方體的構(gòu)建
數(shù)據(jù)倉(cāng)庫(kù)中包含從多種獨(dú)立數(shù)據(jù)源中收集而來(lái)的信息,并整合到一個(gè)公共存儲(chǔ)庫(kù)中用于查詢和分析。通常來(lái)說(shuō),數(shù)據(jù)倉(cāng)庫(kù)的設(shè)計(jì)是用于聯(lián)機(jī)分析處理(OLAP)的,其中的查詢整合了大量數(shù)據(jù)從而去探測(cè)系統(tǒng)運(yùn)行狀況,發(fā)現(xiàn)異常或趨勢(shì),為以后業(yè)務(wù)拓展做進(jìn)一步的指導(dǎo)。
2.1 匯總表的構(gòu)建
為了在數(shù)據(jù)倉(cāng)庫(kù)環(huán)境中加速查詢速度,提高查詢效率,通常會(huì)構(gòu)建大量匯總表(st, summary table)。數(shù)據(jù)倉(cāng)庫(kù)中的數(shù)據(jù)是從各個(gè)基礎(chǔ)的數(shù)據(jù)源中抽取而來(lái),而匯總表就是通過(guò)不同的維度來(lái)組合這些基礎(chǔ)數(shù)據(jù),相當(dāng)于不同的group-by屬性集合,以此代表數(shù)據(jù)源中基礎(chǔ)數(shù)據(jù)的聚合型物化視圖。同時(shí),匯總表也會(huì)計(jì)算各類聚集函數(shù),包括 。舉例來(lái)說(shuō),在數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)中,rollup和cube運(yùn)算符可以通過(guò)一條語(yǔ)句來(lái)定義一些諸如此類的匯總表[3]。
2.2 數(shù)據(jù)立方體的構(gòu)建
由于數(shù)據(jù)倉(cāng)庫(kù)是基于多維數(shù)據(jù)模型構(gòu)建的,用于OLAP的數(shù)據(jù)平臺(tái)。因此,多維數(shù)據(jù)模型是數(shù)據(jù)倉(cāng)庫(kù)的一大重要特點(diǎn),也是數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用和實(shí)現(xiàn)的一個(gè)重要方面。我們可以通過(guò)在數(shù)據(jù)組織和存儲(chǔ)上的優(yōu)化,使其更適用于分析型的數(shù)據(jù)查詢和獲取。
多維數(shù)據(jù)模型是為了滿足用戶從多角度多層次進(jìn)行數(shù)據(jù)查詢和分析的需要而建立起來(lái)的基于事實(shí)和維的數(shù)據(jù)庫(kù)模型,其應(yīng)用主要還是為了實(shí)現(xiàn)OLAP功能。通過(guò)多維數(shù)據(jù)模型的數(shù)據(jù)展示并進(jìn)一步查詢和獲取所需數(shù)據(jù)就是其作用的體現(xiàn)。但其真的作用的實(shí)現(xiàn)在于,可以根據(jù)不同的數(shù)據(jù)需求建立起各類不同的多維模型,并組成數(shù)據(jù)集市開(kāi)放給不同的用戶群體使用,即根據(jù)需求進(jìn)行定制[4]。
數(shù)據(jù)立方體(Data Cube)是多維模型的一個(gè)形象的說(shuō)法。對(duì)于多維數(shù)據(jù)模型來(lái)說(shuō),其維度是不限的,而數(shù)據(jù)立方體僅限于三維模型,是多維數(shù)據(jù)模型的一個(gè)抽象實(shí)例。使用數(shù)據(jù)立方體一方面能夠更方便地解釋和描述;另一方面是為了更好的與傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)二維表區(qū)別開(kāi)來(lái)。
我們以某商貿(mào)公司為例,其代理的產(chǎn)品涉及很多大類,銷售市場(chǎng)范圍遍及全國(guó)。我們可以根據(jù)自己對(duì)數(shù)據(jù)的需要進(jìn)行提取,如圖1所示,抽取數(shù)據(jù)形成一個(gè)三維數(shù)據(jù)模型,即數(shù)據(jù)立方體。通過(guò)構(gòu)建數(shù)據(jù)立方體,能夠更直觀的分析銷售數(shù)據(jù),從而通過(guò)進(jìn)一步分析運(yùn)算得到企業(yè)運(yùn)營(yíng)狀況。
3 啟發(fā)式算例
在數(shù)據(jù)倉(cāng)庫(kù)中構(gòu)建好匯總表和數(shù)據(jù)立方體之后,接下來(lái)重要的事情就是對(duì)他們的維護(hù)。因?yàn)閿?shù)據(jù)的更新變動(dòng)是收集在數(shù)據(jù)源中的,數(shù)據(jù)倉(cāng)庫(kù)中的匯總表和數(shù)據(jù)立方體也必須及時(shí)更新從而反映出數(shù)據(jù)源的變化狀態(tài)。在進(jìn)行更新時(shí),匯總表作為數(shù)據(jù)倉(cāng)庫(kù)中的視圖,可以從頭至尾一步步推算出來(lái),或者運(yùn)用增量維護(hù)技術(shù)計(jì)算出由于數(shù)據(jù)源變化而導(dǎo)致的視圖的變化。而數(shù)據(jù)立方體的維護(hù)主要用于展現(xiàn)不同角度的數(shù)據(jù)。
現(xiàn)在,我們考慮一個(gè)關(guān)于零售信息的數(shù)據(jù)倉(cāng)庫(kù),包含數(shù)百家零售商店的銷售終端(POS, Point of Sales)數(shù)據(jù)。pos數(shù)據(jù)儲(chǔ)存在數(shù)據(jù)倉(cāng)庫(kù)中的一個(gè)大型pos表中,我們稱之為事實(shí)表(fact table),這個(gè)表包含了在銷售交易中售出的每個(gè)商品的元組(即行數(shù)據(jù))。每個(gè)元組表現(xiàn)為如下形式:
其中,元組的屬性分別是:
● storeID:銷售的商品所在商店的ID
● itemID:銷售的商品的ID
● date:商品銷售的日期
● qty:售出商品的數(shù)量
● price:售出商品的價(jià)格
需要指出的是,pos表允許包含重復(fù)的元組。比如,同一個(gè)商品在同一天的同一商店的不同交易中被售出。
另外,數(shù)據(jù)倉(cāng)庫(kù)通常會(huì)儲(chǔ)存維表(dimension tables),維表中包含與事實(shí)表相關(guān)的信息。我們可以分別以“商店表”(stores)和“商品表”(items)表示商店的信息和商品的信息。表stores的主鍵是storeID,表items的主鍵是itemID。如下所示:
stores(storied, city, regio)
items(itemID, name, category, cost)
維表中的數(shù)據(jù)通常代表了維的層級(jí),比如在維表stores中,city和region的包含關(guān)系。一個(gè)維層級(jí)本質(zhì)上是維表屬性之間的一系列函數(shù)依賴。比如,在我們的示例的stores這個(gè)維表中,storeID在函數(shù)上決定了city,同時(shí)city在函數(shù)上決定了region。同樣在items這個(gè)維表中,itemID在函數(shù)上決定了name,category,cost。
在一個(gè)數(shù)據(jù)倉(cāng)庫(kù)中,為了更快的響應(yīng)聚集查詢,通常做法是把匯總表連接一個(gè)或多個(gè)維表之后,再儲(chǔ)存這些匯總表。這些都是物化視圖,他們聚集了基本表中的數(shù)據(jù)。
我們給出了4個(gè)基本的匯總表示例,如圖2所示。每一個(gè)都定義為物化sql視圖。我們假設(shè)這些視圖已經(jīng)被選擇出來(lái)進(jìn)行物化了,選擇的方法可以直接通過(guò)人工選擇,也可以通過(guò)Harinarayan等人提出的一種算法來(lái)實(shí)現(xiàn)[5]。
圖中視圖的名稱是用來(lái)反應(yīng)group-by屬性的。比如,字母S代表storeID;字母I代表itemID,字母D代表date。記號(hào)sC代表商店所在的城市,sR代表商店所在的地區(qū),iC代表商品的類別。舉例來(lái)說(shuō),示例中第3個(gè)視圖SiC_sales代表storeID和category是視圖在定義中的group-by屬性。
除了date作為一個(gè)維度(dimension)和度量(measure)使用外,圖2中的4個(gè)視圖能夠代表“數(shù)據(jù)立方體”的4種可能的點(diǎn)[5]。通常認(rèn)為,數(shù)據(jù)的聚集僅僅從事實(shí)表而來(lái),維層級(jí)信息的獲得是隱含的。然而,由于數(shù)據(jù)倉(cāng)庫(kù)通常顯性地儲(chǔ)存維層級(jí)信息于維表中,我們?cè)诖藬U(kuò)展了“數(shù)據(jù)立方體”的概念,從而使其包括顯性連接維表,形式上的統(tǒng)一更有利于匯總表和數(shù)據(jù)立方體的維護(hù)。
4 匯總表和數(shù)據(jù)立方體的維護(hù)
4.1 匯總表的維護(hù)過(guò)程
隨著銷售交易的出現(xiàn),新的pos數(shù)據(jù)會(huì)定期載入數(shù)據(jù)倉(cāng)庫(kù)的大pos表中。然而,大多數(shù)的數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)并不會(huì)馬上應(yīng)用這些變動(dòng)。相反,這些數(shù)據(jù)變動(dòng)會(huì)被延期更新至數(shù)據(jù)倉(cāng)庫(kù)中的基本表和匯總表中。更新過(guò)程是通過(guò)一個(gè)批處理窗口,每晚對(duì)數(shù)據(jù)倉(cāng)庫(kù)進(jìn)行更新。這種對(duì)數(shù)據(jù)變動(dòng)的延遲更新可以帶來(lái)很多好處。比如,延遲變動(dòng)期間允許數(shù)據(jù)分析人員查詢數(shù)據(jù)倉(cāng)庫(kù),從而能夠看到白天數(shù)據(jù)的連續(xù)快照,這樣能夠使維護(hù)更加高效。
在通常情況下,數(shù)據(jù)倉(cāng)庫(kù)中涉及的變動(dòng)操作僅僅是插入。但是為了結(jié)合本文中的啟發(fā)式算例,我們假定變動(dòng)包括插入和刪除兩種操作。為了在“刪除”存在的情況下正確的維護(hù)一個(gè)聚集視圖,有必要在視圖中包含count(*)聚集函數(shù)。只有在count(*)函數(shù)存在的情況下,才有可能明確統(tǒng)計(jì)出視圖中g(shù)roup-by組的所有元組是否被刪除(即count(*)函數(shù)得到的結(jié)果為0)。
為了陳述的方便性,在本文中,我們假設(shè)維護(hù)僅僅針對(duì)于來(lái)自事實(shí)表的變動(dòng),而且被聚集的列不包含空值。當(dāng)然,我們的算法可以輕易的擴(kuò)展,從而能夠處理來(lái)自維表的變動(dòng),同樣也可以處理聚集列中的空值。
我們提出一種“匯總delta表方法”,通過(guò)它來(lái)維護(hù)圖2中的匯總表SID_sales。我們將該算法的維護(hù)過(guò)程分為兩個(gè)階段:
● 增值:構(gòu)造并運(yùn)算匯總delta表
● 更新:通過(guò)之前的delta表來(lái)更新匯總表
構(gòu)造一個(gè)匯總delta表發(fā)生在增值功能期間,這期間不需要對(duì)匯總表進(jìn)行鎖定,從而數(shù)據(jù)倉(cāng)庫(kù)可以繼續(xù)被訪問(wèn)查詢。待增值完成后,匯總表直到刷新功能期間才被鎖定,在此期間,匯總表通過(guò)匯總delta表進(jìn)行更新[6]。
(1)增值過(guò)程:“增值”功能從延遲的一系列數(shù)據(jù)變動(dòng)中新建一個(gè)匯總delta表。該匯總delta表代表了由事實(shí)表的變化導(dǎo)致的匯總表的凈變化。我們讓延遲的一系列待插入數(shù)據(jù)存放在表pod_ins中;延遲的一系列待刪除數(shù)據(jù)存放在表pos_del中。因此,匯總delta表就會(huì)通過(guò)下述sql語(yǔ)句得到,而不會(huì)訪問(wèn)基本pos表。如圖3所示。
為了計(jì)算匯總delta表,我們首先對(duì)待插入的行和待刪除的行做個(gè)投影。在插入的行中,用1計(jì)數(shù),別名為_(kāi)count;用qty代表數(shù)量,別名為_(kāi)quantity。反之,在刪除的行中,用相應(yīng)的負(fù)數(shù)。之后,把結(jié)果加和并聚集,通過(guò)匯總表中相同的group-by屬性分組。最后,得出結(jié)果的聚集函數(shù)值表示匯總表中相應(yīng)的聚集函數(shù)值的凈變動(dòng)。
(2)更新過(guò)程:“更新”功能是把匯總delta表中的凈變化應(yīng)用到匯總表中。更新SID_sales的方法如圖4所示。“更新”功能會(huì)輸入?yún)R總delta表sd_SID_sales和匯總表SID_sales,并更新匯總表從而反映匯總delta表中的變化。為了簡(jiǎn)單起見(jiàn),我們假定pos表中沒(méi)有空值。
更新功能是一個(gè)快速運(yùn)行的過(guò)程。除了涉及max和min的幾種個(gè)別情況,更新功能不需要訪問(wèn)基本pos表。所有的聚集在“增值”功能中完成。匯總delta表給匯總表帶來(lái)單一的更新,而且匯總表中的每一行最多被更新一次。
圖4所示為一個(gè)嵌入式sql程序,用游標(biāo)完成,過(guò)程如下:
一個(gè)游標(biāo)c1被打開(kāi),用來(lái)遍歷匯總delta表sd_SID_sales中的每一行δt。對(duì)于每一個(gè)δt,會(huì)發(fā)出一個(gè)查詢,同時(shí)第2個(gè)游標(biāo)c2被打開(kāi),用來(lái)在匯總表SID_sales中尋找一個(gè)匹配的行t(最多有一個(gè)匹配的t,因?yàn)槠ヅ涫腔趃roup-by屬性的)。如果沒(méi)有找到一個(gè)匹配的行t,那么δt行就被插入到匯總表。否則,如果t被找到,將會(huì)使用游標(biāo)c2更或者刪除它,這取決于t組中的所有行是否被刪除。
通過(guò)匯總delta表的增值和更新過(guò)程,能夠?qū)崿F(xiàn)匯總表的完整維護(hù),同時(shí)也縮短了了數(shù)據(jù)倉(cāng)庫(kù)關(guān)閉的時(shí)間,大大的提高了效率。
4.2 數(shù)據(jù)立方體的維護(hù)過(guò)程
我們已經(jīng)知道OLAP的操作是以查詢?yōu)橹鳎匆許ELECT操作為主。但是查詢過(guò)程有時(shí)很復(fù)雜,比如基于關(guān)系數(shù)據(jù)庫(kù)的查詢可以多表關(guān)聯(lián),也可以使用COUNT、SUM、AVG、MAX、MIN等聚合函數(shù)。數(shù)據(jù)立方體的構(gòu)建使得OLAP在基于多維模型定義的基礎(chǔ)上,使得一些常見(jiàn)的面向分析的操作更加直觀。
數(shù)據(jù)立方體常見(jiàn)的維護(hù)操作包括以下幾種:
● 鉆取(Drill-down):是指在維的不同層次間的變化,從某一層降到下一層,將匯總數(shù)據(jù)拆分到更細(xì)節(jié)的粒度。
● 上卷(Roll-up):鉆取的逆操作,即從較細(xì)粒度數(shù)據(jù)向更高粒度層的聚合。
● 切片(Slice):選擇維度中的特定值進(jìn)行分析。
● 切塊(Dice):選擇維度中的特定區(qū)域數(shù)據(jù)進(jìn)行分析。
● 旋轉(zhuǎn)(Pivot):指維的位置互換,如同二維表行列轉(zhuǎn)換。
數(shù)據(jù)立方體進(jìn)一步直觀化了多維數(shù)據(jù)模型,在分析處理數(shù)據(jù)的過(guò)程中,對(duì)數(shù)據(jù)立方體的維護(hù)能夠更清晰的給予數(shù)據(jù)分析人員以指導(dǎo),從而更好的完成數(shù)據(jù)的抽取、轉(zhuǎn)換、裝載、分析過(guò)程。
5 結(jié)論
本文提出了在數(shù)據(jù)倉(cāng)庫(kù)中構(gòu)建匯總表和數(shù)據(jù)立方體的過(guò)程,同時(shí)給出了維護(hù)匯總表的匯總delta表算法,通過(guò)增值和更新兩階段的劃分,不僅有效縮短了數(shù)據(jù)倉(cāng)庫(kù)在維護(hù)過(guò)程中關(guān)閉的時(shí)間,也提高了維護(hù)的效率,對(duì)特定數(shù)據(jù)倉(cāng)庫(kù)的高效維護(hù)有一定指導(dǎo)意義。但仍存在需要進(jìn)一步解決的問(wèn)題,如多種匯總表混合維護(hù)的處理等,這些將是今后探索的重點(diǎn)。
參考文獻(xiàn)
[1] 西爾伯沙茨, 楊冬青. 譯數(shù)據(jù)庫(kù)系統(tǒng)概念[M]. 機(jī)械工業(yè)出版社, 2006,10.
[2] W.H.Inmon, 王志海. 數(shù)據(jù)倉(cāng)庫(kù)[M].機(jī)械工業(yè)出版社, 2000,5.
[3] J. Gray, A. Bosworth, A. Layman, and H. Pirahesh. Data cube: A relational aggregation operator generalizing group-by, cross-tab, and sub-total. In Proceedings of the Twelfth IEEE International Conference on Data Engineering, 1996,2: 152-159.
[4] 李澤海. 數(shù)據(jù)倉(cāng)庫(kù)中多維數(shù)據(jù)處理與查詢相關(guān)技術(shù)的研究[M],吉林大學(xué),2005.10:11-26.
[5] V. Harinarayan, A. Rajaraman, and J. Ullman. Implementing data cubes efficiently. In Jagadish and Mumick, 205-216.
[6] Inderpal Singh Mumick, Dallan Quass, Barinderpal Singh Mumick. Maintenance of data cubes and summary tables in a warehouse[J]. 1997, 26(2):100-111.