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