一
前言
最近使用数据同步平台同步一个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 . 对使用不便的地方进行了改进.
后续会通过更多的应用场景来进一步的完善这个平台.
希望通过对这个平台的介绍能帮助读者理解数据同步的一些设计思路及关注点.
网友评论