? ? ? ? 為了實現(xiàn)數(shù)據(jù)倉庫中的更加高效的數(shù)據(jù)處理,今天和小黎子一起來探討ETL系統(tǒng)中的增量抽取方式。增量抽取是數(shù)據(jù)倉庫ETL(數(shù)據(jù)的抽取(extraction)、轉(zhuǎn)換(transformation)和裝載(loading))實施過程中需要重點考慮的問題。ETL抽取數(shù)據(jù)的過程中,增量抽取的效率和可行性是決定ETL實施成敗的關(guān)鍵問題之一,做過數(shù)據(jù)建模的小伙伴都知道ETL中的增量更新機(jī)制比較復(fù)雜,采用何種機(jī)制往往取決于源數(shù)據(jù)系統(tǒng)的類型以及對增量更新性能的要求。今天我們只重點對各種方法進(jìn)行對比分析,從而總結(jié)各種機(jī)制的使用條件和優(yōu)劣性,為數(shù)據(jù)倉庫項目的ETL工程的實施提供增量抽取技術(shù)方案參考。

? ? ? ?在數(shù)據(jù)庫倉庫開發(fā)過程中,無論是全量抽取方案還是增量抽取方案,抽取數(shù)據(jù)的工作一般由數(shù)據(jù)倉庫工具來完成。目前數(shù)據(jù)倉庫開發(fā)工具非常多,比如SE-DWA,DTS,Kettle等等。雖然增量抽取方案設(shè)置比較簡單,但是我們還是需要具體來了解一下增量抽取機(jī)制以便后續(xù)更合理的利用增量抽取方案。下面討論各種增量抽取的實現(xiàn)機(jī)制原理。

一、增量抽取的機(jī)制
實現(xiàn)增量抽取關(guān)鍵準(zhǔn)確快速的捕獲變化的數(shù)據(jù)。優(yōu)秀的增量抽取機(jī)制要求ETL能夠?qū)I(yè)務(wù)系統(tǒng)中的變化數(shù)據(jù)按一定的頻率準(zhǔn)確地捕獲,同時不能對業(yè)務(wù)系統(tǒng)造成太大的壓力,影響現(xiàn)有業(yè)務(wù)。相對全量抽取而言,增量抽取的設(shè)計更復(fù)雜,有一種將全量抽取過程自動轉(zhuǎn)換為增量抽取過程的ETL設(shè)計思路,前提是必須捕獲變化的數(shù)據(jù),增量數(shù)據(jù)抽取中常用的捕獲變化數(shù)據(jù)的方法小黎子了解到的有以下四種方式:
1 、基于觸發(fā)器方式生成增量數(shù)據(jù)

? ?使用觸發(fā)器生成增量數(shù)據(jù)是普遍采取的一種增量抽取機(jī)制。該方式是根據(jù)抽取要求,在要被抽取的源表上建立3個觸發(fā)器插入、修改、刪除,每當(dāng)源表中的數(shù)據(jù)發(fā)生變化,就被相應(yīng)的觸發(fā)器將變化的數(shù)據(jù)寫入一個增量日志表,ETL的增量抽取則是從增量日志表中而不是直接在源表中抽取數(shù)據(jù),同時增量日志表中抽取過的數(shù)據(jù)要及時被標(biāo)記或刪除。
? ?為了簡單演示,增量日志表一般不存儲增量數(shù)據(jù)的所有字段信息,而只是存儲源表名稱、更新的關(guān)鍵字值和更新操作類型(knsen、update或delete),ETL增量抽取進(jìn)程首先根據(jù)源表名稱和更新的關(guān)鍵字值,從源表中提取對應(yīng)的完整記錄,再根據(jù)更新操作類型,對目標(biāo)表進(jìn)行相應(yīng)的處理。
優(yōu)點:數(shù)據(jù)庫本身的觸發(fā)器機(jī)制,契合度高,可靠性高,不會存在有增量數(shù)據(jù)未被捕獲到的現(xiàn)象 ? ?
缺點:對于源系統(tǒng)有較大的影響,需要建立觸發(fā)器機(jī)制,增加運維人員,還要建立臨時表,儲存臨時表,增加儲存成本和運維成本
2 、基于時間戳方式生成增量數(shù)據(jù)

? ?時間戳方式是指增量抽取時,抽取進(jìn)程通過比較系統(tǒng)時間與抽取源表的時間戳字段的值來決定抽取哪些數(shù)據(jù)。這種方式需要在源表上增加一個時間戳字段,系統(tǒng)中更新修改表數(shù)據(jù)的時候,同時修改時間戳字段的值。
? ?有的數(shù)據(jù)庫(例如Sql Server)的時間戳支持自動更新,即表的其它字段的數(shù)據(jù)發(fā)生改變時,時間戳字段的值會被自動更新為記錄改變的時刻。在這種情況下,進(jìn)行ETL實施時就只需要在源表加上時間戳字段就可以了。對于不支持時間戳自動更新的數(shù)據(jù)庫,這就要求業(yè)務(wù)系統(tǒng)在更新業(yè)務(wù)數(shù)據(jù)時,通過編程的方式手工更新時間戳字段。使用時間戳方式可以正常捕獲源表的插入和更新操作,但對于刪除操作則無能為力,需要結(jié)合其它機(jī)制才能完成。
? 優(yōu)點:數(shù)據(jù)處理邏輯清楚,速度較快,成本低廉,流程簡單
? ?缺點:要求源表的時間字段必須是隨表變動而變動的不為空數(shù)據(jù),由于是直接讀取表數(shù)據(jù),該方法無法獲取刪除類型的數(shù)據(jù)。
3、 基于全表比對方式生成增量數(shù)據(jù)

? ?全表比對即在增量抽取時,ETL進(jìn)程逐條比較源表和目標(biāo)表的記錄,將新增和修改的記錄讀取出來。
? ?優(yōu)化之后的全部比對方式是采用MD5校驗碼,需要事先為要抽取的表建立一個結(jié)構(gòu)類似的MD5臨時表,該臨時表記錄源表的主鍵值以及根據(jù)源表所有字段的數(shù)據(jù)計算出來的MD5校驗碼,每次進(jìn)行數(shù)據(jù)抽取時,對源表和MD5臨時表進(jìn)行MD5校驗碼的比對,如有不同,進(jìn)行update操作:如目標(biāo)表沒有存在該主鍵值,表示該記錄還沒有,則進(jìn)行insert操作。然后,還需要對在源表中已不存在而目標(biāo)表仍保留的主鍵值,執(zhí)行delete操作。
? ? 優(yōu)點:因為是基于目標(biāo)對比抽取數(shù)據(jù),所以對源系統(tǒng)無影響
? 缺點:該方法僅僅適合表有主鍵,唯一鍵或者數(shù)據(jù)量較小的表,不然海量數(shù)據(jù)中每條數(shù)據(jù)的每一列都進(jìn)行逐一比對,很顯然這種頻繁的I/O操作以及復(fù)雜的比對運算會造成很大的性能開銷。這樣操作需要足夠的硬件做支撐
4 、基于日志表方式生成增量數(shù)據(jù)

? ?對于建立了業(yè)務(wù)系統(tǒng)的生產(chǎn)數(shù)據(jù)庫,可以在數(shù)據(jù)庫中創(chuàng)建業(yè)務(wù)日志表,當(dāng)特定需要監(jiān)控的業(yè)務(wù)數(shù)據(jù)發(fā)生變化時,由相應(yīng)的業(yè)務(wù)系統(tǒng)程序模塊來更新維護(hù)日志表內(nèi)容。增量抽取時,通過讀日志表數(shù)據(jù)決定加載哪些數(shù)據(jù)及如何加載。日志表的維護(hù)需要由業(yè)務(wù)系統(tǒng)程序用代碼來完成。
? ?優(yōu)點:可以做到數(shù)據(jù)無誤差傳輸,有回滾機(jī)制,有容災(zāi)備份的能力
? ?缺點:數(shù)據(jù)庫開歸檔模式會對源系統(tǒng)數(shù)據(jù)庫的磁盤造成壓力,增加儲存成本,此外大多數(shù)數(shù)據(jù)庫的日志都是不對外開放的,只針對數(shù)據(jù)庫本身的工具開放讀取
二、比較和分析
? ?可見,ETL在進(jìn)行增量抽取操作時,有以上各種機(jī)制可以選擇。現(xiàn)從兼容性、完備性、性能和侵入性3個方面對這些機(jī)制的優(yōu)劣進(jìn)行比較分析。各種數(shù)據(jù)增量抽取機(jī)制的優(yōu)劣性綜合分析如下圖所示。

? ?通過對各種增量抽取機(jī)制的對比分析,我們發(fā)現(xiàn),沒有一種機(jī)制具有絕對的優(yōu)勢,不同機(jī)制在各種因素的表現(xiàn)大體上都是相對平衡的。所以,ETL實施過程中究競選擇哪種增量抽取機(jī)制,要根據(jù)實際的數(shù)據(jù)源系統(tǒng)環(huán)境進(jìn)行決策,需要綜合考慮源系統(tǒng)數(shù)據(jù)庫的類型、抽取的數(shù)據(jù)量(決定對性能要求的苛刻程度)、對源業(yè)務(wù)系統(tǒng)和數(shù)據(jù)庫的控制能力以及實現(xiàn)難度等各種因素,甚至結(jié)合各種不同的增量機(jī)制以針對環(huán)境不同的數(shù)據(jù)源系統(tǒng)進(jìn)行ETL實施。
三、總結(jié)

? ?為了實現(xiàn)數(shù)據(jù)倉庫中數(shù)據(jù)的高效抽取,增量抽取是ETL數(shù)據(jù)抽取過程中非常重要的一步,實現(xiàn)增量抽取的機(jī)制直接決定了數(shù)據(jù)倉庫項目整體開發(fā)的效果。我們通過對比幾種常見的增量抽取機(jī)制并總結(jié)了各種機(jī)制的特性并分析了它們的優(yōu)劣。各種增量抽取機(jī)制都有它有存在的價值和固有的限制條件,所以在ETL的設(shè)計和實施工作過程中,只能依據(jù)項目的實際環(huán)境進(jìn)行綜合考慮,甚至需要對可采用的多種機(jī)制進(jìn)行實際的測試,才能確定一個最優(yōu)的增量抽取方法。