日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

DWH的保留原始历史数据的一种方法

發(fā)布時間:2023/12/13 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 DWH的保留原始历史数据的一种方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前幾天有朋友咨詢在數(shù)據(jù)倉庫Stage或ODS層該如何保存歷史數(shù)據(jù), 他的這個問題其實很普遍, 所以寫了點東西放在博客上.

一般數(shù)據(jù)倉庫項目中, Stage或ODS層要保留幾天或幾個月的源表數(shù)據(jù). 保留歷史業(yè)務數(shù)據(jù)是很必要的, 有時候需要DWH重跑某一天的數(shù)據(jù), 這種情況下, 無法從前端OLTP系統(tǒng)取的當時的數(shù)據(jù). 在比如, 需要DWH在一天內(nèi)要回跑多天batch, 這在項目剛上線時經(jīng)常碰到.

至于是在Stage層還是ODS層保留歷史數(shù)據(jù), 我一般推薦是在Stage層保留歷史, 讓ODS只保留當天的快照數(shù)據(jù). 因為Stage保留的是最原始的數(shù)據(jù).

那如何保留一個表(比如TA表)的歷史數(shù)據(jù)呢? 我能想到的做法有:
1. 將多天的數(shù)據(jù)都放在一個表, 加上一個batch_id字段來區(qū)分到底是哪天的數(shù)據(jù).
2. 用不同表名保存, 比如TA_20110509, TA_20110510 等等.
3. 表名相同, 但把表放在不同的schema下, 比如B20110509.TA, B20110510.TA

這3種做法各有優(yōu)缺點:
方法1的優(yōu)點是, 實現(xiàn)起來簡單, 缺點也很明顯, 就是效率會很差, 如果TA是個大表, 更是如此.
方法2的優(yōu)點是, 和方法1比, 查詢和操作數(shù)據(jù)的效率要好, 缺點是, 編程會復雜一些, 尤其是使用ETL工具, 你可能使用變量或者其他手段將表名傳給ETL Job.
方法3的優(yōu)缺點和方法2基本相同, 另外的優(yōu)點是,數(shù)據(jù)庫backup管理的粒度能做的很細. 另外一個缺點是, 需要管理多個schema的權限, 會繁瑣一些.

我推薦采用方法2. 上面講了方法2比方法1會復雜一些, 有沒有相對簡單的實現(xiàn)方式呢? 下面是我給的一個思路和實現(xiàn)方法.

思路, 假設TA表, 需要保存7份, 分別保存在TA_0, TA_1, TA_2, ..., TA_6表中, 第一次保存到TA_0表, 以此類推, 第7次保存到TA_6表, 第8次再重新使用TA_0表. 我們可以動態(tài)生成兩個視圖, V_TA和V_TA_LAST,. V_TA視圖指向當前batch的工作表,V_TA_LAST指向上一個batch的工作表. 另外, V_TA視圖是屬于那種可更新的視圖, 所以可以在ETL Job(或ETL SP)中V_TA, 而不需直接用TA_0或其他表.

實現(xiàn):
實際項目中, 不同表保存的份數(shù)可能不同, 另外需求可能在項目實施過程中, 也有變化, 所以最好是做成可配置模式. 下面給出2個表, Table_Version_Control_Static定義了各個表的版本控制規(guī)則, Table_Version_Control_History記錄各表版本控制歷史.

上面講過, TA表如果需要保存7份, 分別保存在TA_0, TA_1, TA_2, ..., TA_6表中, 第一次保存到TA_0表, 以此類推, 第7次保存到TA_6表, 第8次再重新使用TA_0表, 這個過程有點像時鐘, 周而復始, 如下圖.


可寫成一個存儲過程sp_clock_go_ahead(n)來完成這個時鐘旋轉(zhuǎn)過程. 具體講,該存儲過程依次完成如下工作:
1. 動態(tài)創(chuàng)建TA_n, 如果TA_n不存在的話.
2. 修改V_TA視圖, 讓它指向TA_n.
3. 修改V_TA_LAST視圖, 讓它指向TA_n-1

雖然V_TA視圖是可更新的,但不支持truncate操作, 所以可以寫一個簡單的sp(比如sp_Truncate_Table)來完成truncate操作.

有了上面的2個表和2個存儲過程, 不管是全量刷新表還是增量刷新表, 都很簡單, 步驟見下:
一. 如采用增量刷新(Incremental), 刷新的步驟是:
1. 執(zhí)行sp_Clock_Go_Ahead()
2. 如果Save_Points>1, 原樣復制V_TA_LAST至V_TA, 結(jié)果是V_TA和V_TA_LAST記錄數(shù)一致
3. Delta Load 到 V_TA

二. 如采用全量刷新(Full), 刷新的步驟是:
1. 執(zhí)行sp_Clock_Go_Ahead()
2. 執(zhí)行sp_Truncate_Table() ,來truncate 表TA_n
3. Load data 到 V_TA

總結(jié)

以上是生活随笔為你收集整理的DWH的保留原始历史数据的一种方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。