趙浩然
(中國(guó)鐵通長(zhǎng)春分公司,吉林 長(zhǎng)春 130061)
隨著計(jì)算機(jī)技術(shù)、網(wǎng)絡(luò)技術(shù)、通訊技術(shù)和Internet技術(shù)的發(fā)展,隨著信息化社會(huì)的演進(jìn),以及計(jì)算機(jī)存儲(chǔ)設(shè)備的高速發(fā)展,在人們的生產(chǎn)生活中充斥著大量的數(shù)據(jù),這些數(shù)據(jù)記錄著各種各樣的信息,如何從豐富的客戶(hù)數(shù)據(jù)中挖掘有價(jià)值的信息,為企業(yè)管理者提供有效的輔助決策,是企業(yè)真正關(guān)心的問(wèn)題,以筆者所在的電信公司為例,如何從各種用戶(hù)消費(fèi)詳單、用戶(hù)信息中有效迅速的提出企業(yè)所需信息,是我們研究的重點(diǎn)。
如何從成千上萬(wàn)甚至百萬(wàn)千萬(wàn)上億的數(shù)據(jù)中找出對(duì)于我們有價(jià)值的信息,因?yàn)樘幚韼资f(wàn)的數(shù)據(jù)即使再?gòu)?fù)雜對(duì)于目前的軟件和硬件發(fā)展水平來(lái)講都是可以迎刃而解的,但是數(shù)據(jù)達(dá)到千萬(wàn)級(jí)或億級(jí)就是一項(xiàng)耗時(shí)持久的事情,往往我們需求的數(shù)據(jù)又是要反復(fù)篩選的,這樣就需要做很多的提前準(zhǔn)備以及應(yīng)用一些技巧。
在實(shí)際工作中遇到的或即將遇到的問(wèn)題:①日數(shù)據(jù)處理量幾百萬(wàn)條,每日每月周期處理;②數(shù)據(jù)來(lái)源于多個(gè)異構(gòu)系統(tǒng);③需保證數(shù)據(jù)完整性,對(duì)異常數(shù)據(jù)進(jìn)行糾錯(cuò);④無(wú)法對(duì)硬件資源升級(jí)。
通常情況下海量的數(shù)據(jù)處理無(wú)法通過(guò)人工處理,只能借助于工具,在比較成熟的產(chǎn)品和應(yīng)用中主要用到了數(shù)據(jù)庫(kù)產(chǎn)品、數(shù)據(jù)倉(cāng)庫(kù)產(chǎn)品和商業(yè)智能產(chǎn)品等以及其組合應(yīng)用,另外,長(zhǎng)期數(shù)據(jù)處理工作中的一些經(jīng)驗(yàn)和總結(jié)也是解決這些問(wèn)題的利器。
數(shù)據(jù)庫(kù)產(chǎn)品中用來(lái)處理海量數(shù)據(jù)比較成熟的目前主要有甲骨文公司的 ORACLE、IBM 的 DB2以及微軟的 SQL SERVER,并且這三家公司都有較完善的數(shù)據(jù)庫(kù)相關(guān)產(chǎn)品,如數(shù)據(jù)倉(cāng)庫(kù)、ETL工具、數(shù)據(jù)挖掘和分析工具,還可以提供全面的數(shù)據(jù)解決方案,其中ORACLE和DB2在大的行業(yè)中應(yīng)用較多,如銀行、電信、大型制造業(yè)企業(yè)以及政府部門(mén)等,SQL SERVER的市場(chǎng)份額還較小,但友好的界面、操作系統(tǒng)的龐大用戶(hù)資源以及中小應(yīng)用的普及和SQL SERVER 2008產(chǎn)品對(duì)商業(yè)智能的全面支持,使得SQL SERVE成為億級(jí)數(shù)據(jù)往下的一個(gè)不錯(cuò)的選擇。我們這里就選擇了微軟的SQL SERVER作為整個(gè)數(shù)據(jù)處理的工具。
對(duì)于海量數(shù)據(jù)處理是硬件配置越高對(duì)于數(shù)據(jù)處理越有利,但硬件已經(jīng)不是數(shù)據(jù)處理成敗的決定性因素,如何在有限的硬件條件下物盡其用,充分發(fā)揮硬件的性能、合理的分配資源,與軟件相輔相成是我們所看重的。我們選用了一臺(tái)戴爾T410的塔式服務(wù)器,雙至強(qiáng)2.13GHz CPU、8G內(nèi)存和兩塊500 G硬盤(pán)。
海量數(shù)據(jù)處理目前主流做法是對(duì)數(shù)據(jù)存儲(chǔ)進(jìn)行分區(qū)操作,并輔以索引。還有通過(guò)建立數(shù)據(jù)倉(cāng)庫(kù)、多維數(shù)據(jù)庫(kù)等商業(yè)智能的方法,優(yōu)化結(jié)構(gòu)來(lái)實(shí)現(xiàn)海量數(shù)據(jù)的處理和查詢(xún)。另外,近期悄然興起的基于開(kāi)源的 HADOOP軟件的分布式查詢(xún)也提供一個(gè)較強(qiáng)大的海量數(shù)據(jù)處理方案。經(jīng)驗(yàn)應(yīng)用上主要還是因地制宜的根據(jù)不同數(shù)據(jù)源和數(shù)據(jù)形式進(jìn)行的一些優(yōu)化,如分視圖、增量抽取、虛擬內(nèi)存、緩存機(jī)制、分批處理、臨時(shí)表、中間表和數(shù)據(jù)采樣等。
我們采用的是數(shù)據(jù)分區(qū)結(jié)合索引的方式。
數(shù)據(jù)分區(qū)分為水平分區(qū)和垂直分區(qū)。水平分區(qū)將表分為多個(gè)表。每個(gè)表包含的列數(shù)相同,但是行少。例如,可以將一個(gè)包含億行的表水平分區(qū)成幾個(gè)表,每個(gè)表存儲(chǔ)一年數(shù)據(jù),或者把一年的數(shù)據(jù)水平分成12個(gè)表,每個(gè)表存儲(chǔ)一個(gè)月的數(shù)據(jù)。任何需要特定月份數(shù)據(jù)的查詢(xún)只需引用相應(yīng)月份的表。而垂直分區(qū)則是將原始表分成多個(gè)只包含較少列的表。水平分區(qū)是最常用的分區(qū)方式,我們也采用水平分區(qū)的方法。
建立分區(qū)表先要?jiǎng)?chuàng)建文件組,而創(chuàng)建多個(gè)文件組主要是為了獲得好的I/O平衡。一般情況下,文件組數(shù)最好與分區(qū)數(shù)相同,并且這些文件組通常位于不同的磁盤(pán)上。每個(gè)文件組可以由一個(gè)或多個(gè)文件構(gòu)成,而每個(gè)分區(qū)必須映射到一個(gè)文件組。一個(gè)文件組可以由多個(gè)分區(qū)使用。為了更好地管理數(shù)據(jù)(例如,為了獲得更精確的備份控制),對(duì)分區(qū)表應(yīng)進(jìn)行設(shè)計(jì),以便只有相關(guān)數(shù)據(jù)或邏輯分組的數(shù)據(jù)位于同一個(gè)文件組中。使用ALTER DATABASE,添加邏輯文件組名。創(chuàng)建文件組后,再使用ALTER DATABASE將文件添加到該文件組中,類(lèi)似的建立三個(gè)文件和文件組對(duì)最近三年的數(shù)據(jù)進(jìn)行分別存儲(chǔ),并把每一個(gè)存儲(chǔ)數(shù)據(jù)的文件放在不同的磁盤(pán)驅(qū)動(dòng)器里。
創(chuàng)建分區(qū)表必須先確定分區(qū)的功能機(jī)制,表進(jìn)行分區(qū)的標(biāo)準(zhǔn)是通過(guò)分區(qū)函數(shù)來(lái)決定的。創(chuàng)建數(shù)據(jù)分區(qū)函數(shù)有 RANGE、“LEFT | / RIGHT”兩種選擇。代表每個(gè)邊界值在局部的哪一邊。例如存在三個(gè)分區(qū),則定義兩個(gè)邊界點(diǎn)值,并指定每個(gè)值是第一個(gè)分區(qū)的上邊界(LEFT)還是第二個(gè)分區(qū)的下邊界(RIGHT)。
創(chuàng)建分區(qū)函數(shù)后,必須將其與分區(qū)方案相關(guān)聯(lián),以便將分區(qū)指向特定的文件組。就是定義實(shí)際存放數(shù)據(jù)的媒體與各數(shù)據(jù)塊的對(duì)應(yīng)關(guān)系。多個(gè)數(shù)據(jù)表可以共用相同的數(shù)據(jù)分區(qū)函數(shù),一般不共用相同的數(shù)據(jù)分區(qū)方案??梢酝ㄟ^(guò)不同的分區(qū)方案,使用相同的分區(qū)函數(shù),使不同的數(shù)據(jù)表有相同的分區(qū)條件,但存放在不同的媒介上。
建立好分區(qū)函數(shù)和分區(qū)方案后,就可以創(chuàng)建分區(qū)表了。分區(qū)表是通過(guò)定義分區(qū)鍵值和分區(qū)方案相聯(lián)系的。插入記錄時(shí),SQL SERVER會(huì)根據(jù)分區(qū)鍵值的不同,通過(guò)分區(qū)函數(shù)的定義將數(shù)據(jù)放到相應(yīng)的分區(qū)。從而把分區(qū)函數(shù)、分區(qū)方案和分區(qū)表三者有機(jī)的結(jié)合起來(lái)。
分區(qū)建好后,還要對(duì)分區(qū)進(jìn)行維護(hù)。分區(qū)的維護(hù)主要涉及分區(qū)的添加、減少、合并和在分區(qū)間轉(zhuǎn)換??梢酝ㄟ^(guò) ALTER PARTITION FUNCTION的選項(xiàng) SPLIT,MERGE和 ALTER TABLE的選項(xiàng)SWITCH來(lái)實(shí)現(xiàn)。SPLIT會(huì)多增加一個(gè)分區(qū),而MEGRE會(huì)合并或者減少分區(qū),SW ITCH則是邏輯地在組間轉(zhuǎn)換分區(qū)。
現(xiàn)在我們對(duì)分區(qū)前后的效果進(jìn)行比較,對(duì)一張存儲(chǔ)4 000萬(wàn)條的記錄進(jìn)行分區(qū),服務(wù)器為戴爾T410,CPU至強(qiáng)2.13 G*2、內(nèi)存8 G、硬盤(pán)500 G*2,系統(tǒng)平臺(tái)為Windows 2008+SQL Server 2008。
從以下四個(gè)方面進(jìn)行比較:①根據(jù)時(shí)間檢索某一天記錄所耗時(shí)間;②單條記錄插入所耗時(shí)間;③根據(jù)時(shí)間刪除某一天記錄所耗時(shí)間;④統(tǒng)計(jì)每月的記錄數(shù)所需時(shí)間。

表1 比較結(jié)果 / m s
從比較結(jié)果可以看出,對(duì)分區(qū)表進(jìn)行操作比未分區(qū)的表要快,這是因?yàn)閷?duì)分區(qū)表的操作采用了CPU和I/O的并行操作,檢索數(shù)據(jù)的數(shù)據(jù)量也變小了,定位數(shù)據(jù)所耗時(shí)間變短。
除了數(shù)據(jù)分區(qū)外,建立索引是一個(gè)非常必要的補(bǔ)充。但建立索引要考慮到具體情況,例如針對(duì)大表的分組、排序等字段,都要建立相應(yīng)索引,一般還可以建立復(fù)合索引,對(duì)經(jīng)常插入的表則建立索引時(shí)要小心,建有索引的表在進(jìn)行數(shù)據(jù)插入時(shí)會(huì)變的非常慢。所以當(dāng)插入表時(shí),首先刪除索引,然后插入完畢,建立索引,并實(shí)施聚合操作,聚合完成后,再次插入前還是刪除索引。索引的填充因子和聚集、非聚集索引也都要考慮。
3.2.1 加大虛擬內(nèi)存
如果系統(tǒng)資源有限,內(nèi)存提示不足,則可以靠增加虛擬內(nèi)存來(lái)解決。一般虛擬內(nèi)存應(yīng)設(shè)置為物理內(nèi)存的3倍為最好,并且虛擬內(nèi)存應(yīng)分別設(shè)置在不同的磁盤(pán)上,這樣可以得到高于物理內(nèi)存數(shù)倍的容量,解決資源不足的問(wèn)題。
3.2.2 分批處理
顧名思義,就是把數(shù)據(jù)化整為零,對(duì)海量數(shù)據(jù)分批處理,然后處理后的數(shù)據(jù)再進(jìn)行合并操作,這樣逐個(gè)擊破,有利于小數(shù)據(jù)量的處理,不至于面對(duì)大數(shù)據(jù)量帶來(lái)的問(wèn)題,不過(guò)這種方法也要因時(shí)因勢(shì)進(jìn)行,如果不允許拆分?jǐn)?shù)據(jù),還需要另想辦法。不過(guò)一般的數(shù)據(jù)是按天、按月、按年等存儲(chǔ)的,都可以采用先分后合的方法,對(duì)數(shù)據(jù)進(jìn)行分開(kāi)處理。
3.2.3 優(yōu)化查詢(xún)SQL語(yǔ)句
在對(duì)海量數(shù)據(jù)進(jìn)行查詢(xún)處理過(guò)程中,查詢(xún)的SQL語(yǔ)句的性能對(duì)查詢(xún)效率的影響非常大,編寫(xiě)高效優(yōu)良的SQL腳本和存儲(chǔ)過(guò)程是數(shù)據(jù)庫(kù)工作人員的職責(zé),也是檢驗(yàn)數(shù)據(jù)庫(kù)工作人員水平的一個(gè)標(biāo)準(zhǔn),在對(duì)SQL語(yǔ)句的編寫(xiě)過(guò)程中,例如減少關(guān)聯(lián)、少用或不用游標(biāo)、設(shè)計(jì)好高效的數(shù)據(jù)庫(kù)表結(jié)構(gòu)等十分必要。
海量數(shù)據(jù)處理是一件既簡(jiǎn)單又繁復(fù)的事情,并且對(duì)數(shù)據(jù)分析和挖掘也越來(lái)越重要,從海量數(shù)據(jù)中提取有用信息重要而緊迫,這便要求處理要準(zhǔn)確,精度要高,而且處理時(shí)間要短,得到有價(jià)值信息要快,這也使得近幾年海量數(shù)據(jù)處理的方式方法得到進(jìn)一步的拓展,也隨著硬件設(shè)備的更新?lián)Q代處理性能突飛猛進(jìn),海量數(shù)據(jù)處理將在一定時(shí)間內(nèi)得到很好的解決。