原創於2023年12月28日,2023年10月15日遷移至此。
etl是資料倉儲的乙個重要處理環節, extract即是從業務資料庫中抽取資料 ,transform即是根據業務邏輯規則對資料進行加工的過程, load即是把資料載入到資料倉儲的過程。
通常為了盡可能的減少對業務系統的壓力和效能影響,或者因為網路傳輸異構資料庫等原因,一般都是根據特定的增量抽取原則,將資料從業務資料庫匯出到 flat文字檔案或者 xml檔案中,也叫資料快取區或者資料登台區(這名字起得特別彆扭)。本文討論的是從業務資料庫直接抽取到資料倉儲。資料倉儲是一種體系架構,而不是一種純粹的技術。實際上,大多數資料庫都提供了類似的不同資料庫直接連線的介面,例如 sqlserver的鏈結資料庫, oracle的透明閘道器等等。
關於資料的增量抽取也是乙個重要的討論話題,其原因主要是在超大資料量情況下任何關聯式資料庫都無法滿足資料處理的要求。在《資料倉儲》 (inmon)一書中,主要描述了以下 3種方法:
1、 資料增量抽取,主要是基於時間戳的
2、 掃瞄增量檔案,實際上就是關聯式資料庫的歸檔日誌。
3、 前後映像對比
當然每種方法都有其優勢和劣勢,本文旨在討論基於時間戳的資料增量抽取的實現,無意**和比較這三種方法的優劣。
當然在進行基於時間戳的資料增量處理之前,首先要滿足以下假設。
1、 假設在業務資料庫中存在著乙個特定的時間屬性,作為增量抽取的唯一標識。
2、 假設在這個欄位上存在著索引字段。這樣我們的資料增量抽取模擬指令碼就不會遭遇到效能瓶頸。當然我們還會通過將大事務盡可能變成小事務的原則進行優化。
3、 假設業務資料庫和資料倉儲能夠以某種方式直接連線。
4、 抽取過程中,盡量避免資料轉換、清洗的動作,以減少對業務資料庫的效能影響。
在滿足了以上條件之後,我們才能進一步考慮資料增量抽取指令碼的實現。
下面開始對基於時間戳的資料增量抽取進行系統設計:
1、 建立鏈結資料庫。
2、 首先需要定義一張資料字典表,定義需要進行處理的任務,其中主要包括業務資料庫和目標資料庫的表名、字段列表、以及 where條件等。 序號
欄位名稱
字段描述
字段型別 備註
1taskname
任務名稱
varchar(32)
2 targettable
資料倉儲目標表名稱
varchar(32)
3 targetfieldlist
資料倉儲字段列表
varchar(500)
4 sourcetable
業務資料庫表名稱
varchar(32)
5 sourcefieldlist
業務資料庫字段列表
varchar(500)
6 wherefieldname
增量抽取欄位名稱
varchar(32)
7 inctype
增量抽取的粒度
int1、小時; 2、日 8
transtype
控制事務處理大小的粒度
int1、小時; 2、日 9
targetdate
資料倉儲最大時間
datetime
10 sourcedate
業務資料庫最大時間
datetime
擷取到整點 11
flag
處理標誌
int1成功, 2失敗 12
note 備註
varchar(500)
3、 有了這張字典表就可以開始進行工作了,為了方便表達,暫時處理成偽**形式,同時只以乙個表的處理為例。
1、獲取資料倉儲目標表目前的最大時間(讀取字典表或者當前表均可)
2、獲取業務資料庫業務表目前的最大時間(需要到業務系統中去讀取)
3、如果業務資料庫業務表資料為空,退出執行
4、如果資料倉儲為空,業務資料庫不為空,則再次讀取業務資料庫最小時時間
5、如果均不為空,則設定開始抽取最小時間和最大時間
6、最大時間設定為整點
7、根據控制事務處理大小的粒度,進行迴圈抽取
8、拼寫 sql語句,寫成類似以下的形式
insert into targettable (targetfieldlist)
select sourcefieldlist from sourcetable
where wherefieldname> begindate
and wherefieldname< begindate+粒度
9、處理狀態寫入該字典表
1、獲取資料倉儲目標表目前的最大時間(讀取字典表或者當前表均可)
2、獲取業務資料庫業務表目前的最大時間(需要到業務系統中去讀取)
3、如果業務資料庫業務表資料為空,退出執行
4、如果資料倉儲為空,業務資料庫不為空,則再次讀取業務資料庫最小時時間
5、如果均不為空,則設定開始抽取最小時間和最大時間
6、最大時間設定為整點
7、根據控制事務處理大小的粒度,進行迴圈抽取
8、拼寫 sql語句,寫成類似以下的形式
insert into targettable (targetfieldlist)
select sourcefieldlist from sourcetable
where wherefieldname> begindate
and wherefieldname< begindate+粒度
9、處理狀態寫入該字典表
4、 有一點要主要的是,在 sqlserver中有兩種使用鏈結資料庫的方法:
openquery ( linked_server , 'query' )
linked_server_name.catalog.schema.object_name 的四部分名稱
這兩種方法各有利弊,第二種容易閱讀一些;第一種方法據說把語句提交到源資料庫執行的,效率可能會高些(實際的資料並未找到)。
其次這兩種方法在使用起來語法有點差別,第一種方法採用的是宿主資料庫的語法形式,第二種方法採用的是 sqlserver本身的語法形式。因此在寫指令碼的時候也會有所不同。主要差別是在字段列表和條件處,暫時採用第一種方式。
關於資料增量抽取的模擬實現 原理
etl是資料倉儲的乙個重要處理環節,extract即是從業務資料庫中抽取資料 transform即是根據業務邏輯規則對資料進行加工的過程,load即是把資料載入到資料倉儲的過程。通常為了盡可能的減少對業務系統的壓力和效能影響,或者因為網路傳輸異構資料庫等原因,一般都是根據特定的增量抽取原則,將資料從...
關於資料增量抽取的模擬實現 原理
etl是資料倉儲的乙個重要處理環節,extract即是從業務資料庫中抽取資料 transform即是根據業務邏輯規則對資料進行加工的過程,load即是把資料載入到資料倉儲的過程。通常為了盡可能的減少對業務系統的壓力和效能影響,或者因為網路傳輸異構資料庫等原因,一般都是根據特定的增量抽取原則,將資料從...
關於資料增量抽取的模擬實現 指令碼實現
本文主要是針對關於資料增量抽取的模擬實現 原理 進行實現的 實現的環境 業務資料庫 oracle9i 資料倉儲資料庫 sqlserver2000 1 前提sqlserver伺服器已經安裝oracle驅動,不再詳細累述 2 建立鏈結資料庫 開啟企業管理器 安全性 鏈結伺服器 右鍵新建 一般情況下執行c...