ABAP随笔-程序优化笔记

2022-06-23 15:27:08 浏览数 (1)

昨天做了一个别人的程序优化,朋友圈小伙伴留言,写出来看看是如何优化的。

取数逻辑上基本都改了。做这个程序优化真是痛并快乐着,首先拿到一个程序,不完全不知道逻辑,那么首先得看懂它的逻辑,然后想办法去优化。趁着这次机会,写一下ABAP的优化吧。

总的来说,对于S4 HANA 数据库执行要优于应用层的执行,但是我们需要减少数据库和应用层的交互次数。

1.尽量明确自己要取得字段,

优化之前

优化之后

SELECT * FROM LIPS INTO TABLE @ITABWHERE ···

SELECT VBELN,POSNR,MATNR INTO TABLE @ITAB WHERE ···

2.在select 查询时,特别是需要经过选择界面筛选处理的,尽量使用inner join ( left outer join) 一次性抓取出来。别使用for all entries in。

如:选择屏幕上有

3.在写for all entries in 的时候注意点

1.写全你要所要取数据的主键,来保证每条数据是唯一的,因为forall entries in 自带selectdistinct去重功能.(直接把所要取得表得主键都写上呗)

2.先判断下for allentries in itab 这个表是否为空,ifitab[] is not initial 一定要有,这个ABAPer应该都知道

3.使用时可以将itab 按照for all entries in的条件排序去重一下,来尽可能缩小itab表,如下:

4.for all entries in 非常消耗内存,当itab过大的时候不建议使用,若是你一定要用请这么操作:(当itab过大时,会引起资源瓶颈)

4.内表的使用方面

a) 尽量使用hash表,其次是sort表,然后再是standard表

注:尽量使用sort表吧,实际实施过程中,哈希表用的还是很少的,很多时候我们需要很灵活的对表进行各种字段排序,Sort表的插入数据会比标准表要耗时。

b) 使用 LOOP AT GT_OUT ASSIGNING FIELD-SYMBOL(<FS>).会比使用 into要好,特别是需要修改数据的时候。当然用loop at itab , at end of , sum求和不能使用<fs>了。

使用<fs>时,遇到at end of 操作,<fs>中数据不会变成*

c) 常用: read table 时 注意排序,然后使用binary search来提高效率

它的升级版就是提升双层loop的效率,这个在合计值和子表不止一个值和主表对应时比较好用。

d) 对内表进行删除操作时,最好这么操作

e) 合计值的时候使用collect

这个语句还是挺高效的。

合计6W多条数据:

同时新语法:LOOP AT GROUP 在合计方面也是挺好使用得

同样的数据,相对比collet还是要逊色一点

但是下面这个图就让我体会了一把HANA数据库的强大

代码是:

5.使用SE30和 ST05取分析程序各个部分的执行时间

进入SE30:选择OLD SE30,点击左下角的分析,你可以看到程序的ABAP时间和DB时间

现在一般使用新得SE30,可以看到每个部分执行得时间,进而进行优化

END

0 人点赞