一
前言
最近使用數(shù)據(jù)同步平臺同步一個2千萬條記錄的表. 執(zhí)行時系統(tǒng)報SHORT DUMP. 提醒內(nèi)存空間不足(如圖一). 報錯的原因是因為之前的處理邏輯是整表讀取,整表寫入. 在讀取大量數(shù)據(jù)后出現(xiàn)內(nèi)存溢出.為了解決這個問題,對數(shù)據(jù)同步平臺進(jìn)行了改進(jìn).
本文主要介紹數(shù)據(jù)同步平臺對大表處理的幾種方式.
數(shù)據(jù)同步平臺的其它介紹
詳見鏈接無峰盗舰,公眾號:ABAP 技巧與實戰(zhàn)SAP工具箱 數(shù)據(jù)同步平臺( 一 簡介 )
詳見連接無峰蹋笼,公眾號:ABAP 技巧與實戰(zhàn)SAP工具箱 數(shù)據(jù)同步平臺( 二 配置 )
詳見連接無峰,公眾號:ABAP 技巧與實戰(zhàn)SAP工具箱 數(shù)據(jù)同步平臺(三 改進(jìn))
圖一
二
大表處理方式
對大表的處理有兩種思路:
分包處理, 設(shè)置每個包允許的數(shù)據(jù)條目數(shù), 每個包分別讀取,寫入,減少對內(nèi)存的占用. 最后統(tǒng)一提交數(shù)據(jù)更改.
分塊處理,按業(yè)務(wù)字段把數(shù)據(jù)內(nèi)容區(qū)分成多塊.比如找到一個合適的字段,根據(jù)字段的內(nèi)容可以把表內(nèi)容區(qū)分多個子塊,然后對每個子塊實現(xiàn)傳輸,每個子塊分別提交數(shù)據(jù)更改.
通過比較可以發(fā)現(xiàn), 分包方式處理比較簡單.但因為統(tǒng)一提交數(shù)據(jù)更改, 如果有任何分包處理失敗,會導(dǎo)致整體失敗.
分塊處理比較麻煩,但是每個子塊單獨提交,彼此之間不影響. 有問題的子塊可以單獨重新處理.
在優(yōu)化數(shù)據(jù)平臺處理大表時,實現(xiàn)了上述兩種方式,同時對第二種方式做了增強(qiáng):自動分塊.
自動分包處理
手工分塊處理
自動分塊處理
三
自動分包處理
通過配置表字段 ZTSYNC_C1-PACKAGE_NUM (如圖二)設(shè)置非0的數(shù)字來實現(xiàn).
實際處理時,默認(rèn)使用了分包處理方式.
每個包分別讀取數(shù)據(jù),寫入數(shù)據(jù). 所有包完成后,統(tǒng)一提交數(shù)據(jù)更新. 如果有分包處理失敗. 則所有數(shù)據(jù)回滾,提示處理失敗.
平臺會按分包顯示執(zhí)行進(jìn)度(如圖三).
進(jìn)度顯示的小BUG
SPRING
進(jìn)度條只顯示100個處理包的準(zhǔn)確進(jìn)度. 小于100個包或大于100個包,進(jìn)度不能準(zhǔn)確的反應(yīng)實際執(zhí)行情況.
如果要優(yōu)化進(jìn)度顯示的小BUG, 需要先獲取一下表的條目數(shù), 這樣會有些性能的代價,所以暫不考慮.
圖二
圖三
四
手工分塊處理
通過設(shè)置主表過濾條件ZTSYNC_C1-FILTER來對數(shù)據(jù)進(jìn)行分塊處理. 每個分塊是一個配置行. (如圖四)
每個分塊的數(shù)據(jù)也可以分包.
每個分塊單獨提交,其中一個分塊報錯不影響其它分塊的正常處理.
手工分塊的一個缺陷是除非窮盡分塊字段的所有組合內(nèi)容,否則會出現(xiàn)分塊不完整的情況.
按月份分塊是一個簡單實用的分塊方式.
允許對日期字段設(shè)置過濾條件. 針對不同的數(shù)據(jù)庫,日期字段的設(shè)置方式不同(遵照不同數(shù)據(jù)庫的語法要求)
HANA數(shù)據(jù)庫
示例 按地點1001和年份2020設(shè)置過濾條件
WERKS = '1001' and substr( BUDAT,1,4) = '2020'
ORACLE數(shù)據(jù)庫
示例 按地點1001 和年份 2020 設(shè)置過濾條件
WERKS = '1001' and substr(to_char( BUDAT,'YYYYMMDD'),1,4) = '2020'
如圖五 可以看到分塊執(zhí)行的SQL語句中的查詢條件
圖四
圖五
五
自動分塊處理
通過配置分組字段來實現(xiàn)自動分塊處理.
實際同步數(shù)據(jù)之前, 系統(tǒng)會按分組字段構(gòu)造一個查詢語句,查詢出分組字段的所有可能的內(nèi)容組合. 然后按分組字段及內(nèi)容組合自動對數(shù)據(jù)進(jìn)行分塊處理. 每個分塊單獨提交.
自動分塊解決了手工分塊可能的數(shù)據(jù)不完整的缺陷.但是需要選擇合適的分組字段, 如果分組字段內(nèi)容組合過多, 對性能也會有負(fù)面的影響.
如圖七,可以看到自動分塊處理的結(jié)果及每個分塊的SQL語句
圖六
圖七
六
手動/自動分塊結(jié)合
手動分塊可以和自動分塊一起使用.
一起使用時需要注意不要使用相同的維度. 比如主表過濾字段如果設(shè)置了WERKS = '1001' . 則分組字段最好就不要再使用WERKS字段了. 避免出現(xiàn)邏輯上的錯誤.
七
總結(jié)
數(shù)據(jù)同步平臺經(jīng)過項目上的實際使用. 發(fā)現(xiàn)并修復(fù)了部分BUG . 對使用不便的地方進(jìn)行了改進(jìn).
后續(xù)會通過更多的應(yīng)用場景來進(jìn)一步的完善這個平臺.
希望通過對這個平臺的介紹能幫助讀者理解數(shù)據(jù)同步的一些設(shè)計思路及關(guān)注點.