场景:
年前我们最开始依靠SAP CQC顾问的优化方案,但SAP顾问应该是短时间没有消化这个程序,导致优化方案反而更慢,我们回退了程序。节前,我们的方案集中在使用并行方式处理数据,该方案技术上是成功的,但业务认为不好收集错误数据,没有采用。今天,ESB帮助优化了接口的工作方式,我再仔细跟踪了程序,和兴伟一起完成了本次优化。
只是对数据库的访问关注,就可以获得很多的优化方案,比如这个程序:
我们用ST12得到该程序的跟踪,关注点如下:
1、对MARA的访问有1365500这么多次,而且是访问数据库,虽然HANA数据库也是内存,但是到数据库取数需要经过网络的访问,每一次都有时间的损耗。
2、对MAKT的读取有396785次,也是访问的数据库。
3、对CABNT、CAWN、CAWNT的访问到了数据库,但是次数比较少,只有19224次。
4、对GT_PVCMPD的访问次数比较大,有346303次,但是没有经过数据库。
5、调用时间搓函数有396785次,但是没有访问到远程的数据库。
所以,我们先优化掉多次访问数据库的地方,把1、2、3处的代码改成一次读取表,避免多次访问数据库就可以获得很好的收益。从多次访问数据库优化到访问内表,对MAKT的访问从93秒降低到0.5秒,对MARA的访问从320秒降低到1秒。
不留下点代码,怎么体现这个ABAP的文章也,好吧,优化MAKT的代码DEMO如下:
”定义一个排序内表,后面查询快
DATA gt_makt TYPE SORTED TABLE OF makt WITH NON-UNIQUE KEY matnr spras.
DATA gs_makt TYPE makt.
“一次取全部数据到内表
SELECT * INTO TABLE gt_makt FROM makt.
“原代码
* SELECT SINGLE maktx
* INTO CORRESPONDING FIELDS OF ls_data3
* FROM makt
* WHERE matnr = ls_data3-matnr
* AND spras = sy-langu.
"james_lx 2022.3.17 优化
READ TABLE gt_makt WITH KEY matnr = ls_data3-matnr spras = sy-langu INTO gs_makt.
IF sy-subrc = 0.
ls_data3-maktx = gs_makt-maktx.
ENDIF.