Package設計2 增量更新

2022-02-18 09:08:53 字數 1914 閱讀 5438

ssis 設計系列:

一般來說,etl實現增量更新的方式有兩種,第一種:記錄欄位的最大值,如果資料來源中存在持續增加的資料列,記錄上次處理的資料集中,該列的最大值;第二種是,儲存hashvalue,快速檢查所有資料,發現異動的資料之後,只同步更新被修改的資料。

1,欄位的最大值

記錄欄位的最大值,使用datetime記錄源資料上次更新的時間,或使用timestamp或rowversion記錄上次更新的數值

一般情況下,dba在設計表時,都會在表中建立lastupdatedtime欄位,資料型別是datetime 或 datetime2(7),用於記錄資料更新的時間。使用datetime記錄上次更新的時間,要求對資料來源進行update或insert操作時,都要更新lastupdatedtime欄位為當前的時間值。

如果建立timestamp或rowversion型別的字段,那麼對資料進行update或insert修改時,系統會負責維護該欄位,保證其值持續增加。

使用這種方式的特點是,對table中的任意乙個column進行update,都會更新參照值。如果源系統有部分column沒有匯入etl,而源系統卻頻繁更新這些column,那麼會導致etl每次載入的資料,並不是「更新」的資料。

2,使用hash值

儲存hashvalue,使用checksum或binary_checksum獲取hashvalue,對更新的資料進行同步操作

如果table中沒有持續增加的column,那麼記錄字段最後一次更新的值,將是不可行的。此時,可以使用checksum或binary_checksum等hash函式快速檢查源資料,並將hashvalue儲存到乙個hashtable中(該hashtable有三列:業務鍵,hashvalue,syncstatus)

。如果乙個資料行的hashvalue 和 hashtable中記錄的hashvalue 有出入,說明該資料行發生變化。

使用這種方式的特點是:每次都要對資料來源進行全部掃瞄,獲取hashvalue;比較hashvalue,只對異動的資料進行資料同步。由於對源資料進行全部的掃瞄 和 hash隱射都會消耗時間,在使用這種方式之前,需要多做測試,監控io,cpu 和 記憶體的使用情況。

注意:只對etl需要的columns進行hash 對映,儲存hashvalue。即使源table的其他columns發生update,etl也不會認定該資料行發生變化。

3,使用hashvalue,分批匯入

使用hashvalue,將源資料分批匯入etl進行處理

如果對源資料的處理非常耗時,那麼可以將源資料分批匯入etl,增加資料處理的並行度,以減少etl的執行時間。

hashtable有三列:業務鍵,hashvalue,syncstatus,用以記錄上次更新時源資料的hashvalue

step1,掃瞄源資料,獲取hashvalue,對於同乙個資料行,如果當前的hashvalue跟hashtable中記錄的hashvalue不同,那麼設定syncstatus=0;etl要處理的全部資料,其syncstatus=0。

step2,將處理流程複製為n個batch,將hashvalue/n=0,1,2,,,n-1的資料分別引入對應的n個batch中,這樣,n個batch會同時處理不同的資料。在每個batch處理完成之後,都會設定syncstatus=1;

optional step3,在乙個batch中,可以使用乙個迴圈,每次只處理 m條資料,並將處理過的資料的syncstatus設定為1。例如,在10號batch中,一次迴圈只處理200條資料,那麼這200條資料的特點是:syncstatus=0,hashvalue/n=9。

使用這種設計的場景是:處理資料的task非常耗時,由於task是同步的,乙個task在將資料處理完成之前,下游task必須等待,因此,可以將資料集分為多個不重複的子集同時處理,各個task都在執行資料處理,提高資料處理的併發度,減少etl的整體時間。

kettle 2(實現增量更新 插入 更新)

由來 需要將乙個系統的資料 mysql 抽取到另乙個系統 oracle 使用etl方式。隨著資料量的增加,全量同步資料不可行,所以得做增量更新。業務資料表有主鍵,除了新增外,以前同步的資料非主鍵資訊可能會發生更改。1.看了下網上的思路,有一種是這樣的 a代表表名 一句話概括 通過主鍵對比找到新增行 ...

Kettle 增量更新設計技巧

有刪除,有增加,有更新 首先你需要判斷你是否在處理乙個維表,如果是乙個維表的話,那麼這可能是乙個scd情況,可以使用kettle的dimension lookup 步驟來解決這個問題,如果你要處理的是事實表,方法就可能有所不同,它們之間的主要區別是主鍵的判斷方式不一樣。事實表一般都資料量很大,需要先...

app後端設計 資料增量更新

因為分頁機制的存在,這個演算法實現起來是挺多需要注意的地方,下面我舉乙個簡化的例子詳細說明 一些假設 count 每頁的顯示條數 預設為3 page 當前頁碼 預設為1 since 時間戳,若指定此引數,則返回時間戳大於等於since的結果 應該是上次獲取的最新資料的update time max ...