2016年6月27日 星期一

不用Log將資料標示為處理過的作法

需要將資料標示是否處理過時,最直覺的作法是有個欄位,記錄該筆資料是否處理過。

可以新增欄位的情況:
直接在原本的資料表加欄位,並且對這個欄位做Index,這個欄位放置資料是否處理過的標示。這個作法,是可以清清楚楚的確實知道是否這筆資料是否有處理過。

新增Log資料表的作法:
會採用這個作法是因為,很多資料表都需要新增欄位去標示這筆資料是否處理過,甚至得各別標示這個欄位是否處理過。可是又不是每個欄位都需要標示,所以不適合每個欄位都再各別新增一個欄位作標示。是否要標示,是根據設定來決定的。所以決定新增一個資料表統一記錄這個資料表的這個欄位是否處理過。如果日後原本的資料表新增了欄位,也可以很靈活的直接在這個新增的資料表作記錄。新增的資料表,放置TableName, KeyColumn, KeyID,  ColumnName,  Mark,作Log的記錄。

結果實際使用時,原本的資料量相當的龐大,造成新資料表記錄的Log也多。於是  JOIN 起來,速度非常的慢。 造成程式處理的效能相當的差,甚至是有加Index的情況也是。看來並不是個好辦法。

效能好的作法:
最後大家集思廣益的作法是,直接用 ID 或 時間,篩選這筆資料是否處理過。比如說,原本的資料表共有100筆資料,3個欄位需要標示是否處理過。可以用資料建立時間來記錄處理到哪一筆了,這時候只需要3筆記錄,用時間來篩選最後處理的資料是哪筆。上面提到的新增Log資料表的作法,是會記錄到100x3=300筆資料的。這種作法,由於需要處理的資料變少,大大的提升效能。姑且稱之為小Log資料表作法吧。先列出小Log資料表最後處理的時間,在用這個時間直接去對原本的資料表作篩選,把最後處理時間之後的資料都列出來。原本的資料表,時間篩選欄位,最好加上Index。或是列出最後處理的ID之後的資料。

當然,也要加上一些防止資料重複處理的作法,例如,篩選出來的資料,可以用邏輯判斷這筆資料是否有被處理過的特徵。

如果不需要記錄這麼多欄位,也可以簡單的把最後處理的時間,放到文字檔裡。

看你怎麼選擇囉。