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