去年的时候进行了一下Performance的培训,也实际动手对占用系统资源严重的程序进行了tuning,效果还不错!我tuning的一个程序,在tuning以前需要跑20多个小时,tuning完成以后只需要3-4个小时就可以了,用户很满意,我很得意,哈哈!今天有空,所以就将一些ABAP tuning的方法记录如下:
一,尽量杜绝使用select...endselect的实用方法而使用internal table.
二,Loop里面不要嵌套select.可以首先使用for all entry in的方法将select的内容放置到internal table中,然后对该table进行排序,最后在loop里面使用read table ....with key ...binary search的方法。(此方法有一个例外,在外层loop数据量大的情况下,如果loop里面嵌套的select每次只读取出几条数据,而使用for all entry in的方法读取出来的数据量十分庞大的时候,在使用read table binary seach的方法可能会造成内存不足从而dump的情况。该结论未经证实。而是同事得出的结论:loop的内表中有100多万条数据,loop里面select时每次只读出了几条,而使用for all entry in的情况下则读出了好几百万条的数据,最后造成了内存不足的情况。我的意见:遇到该种情况可以实际动手对两种情况进行一些测试比较)
三,使用select读取表数据的时候尽量使用主键或者index.如何判断index是否有作用以后抽时间在讲。
四,避免Loop里面套Loop的方法或者是Loop里面嵌套delete table where ...。可以使用field symbols来解决该问题。这一招实际应用中非常有效果。具体如何实现请参考如下代码:
LOOP AT itab.
DELETE itab1 WHERE matnr = itab-matnr AND
vbeln = itab-vbeln AND
posnr = itab-posnr.
ENDLOOP.
Recommendation:
field-symbols <fs> like line of itab.
field-symbols <fs1> like line of itab1.
loop at itab assigning <fs>.
read table itab1 transporting no fields binary search with
key matnr = <fs>-matnr
vbeln = <fs>-vbeln
posnr = <fs>-posnr.
lf_from_index = sy-tabix.
if sy-subrc eq 0.
loop at itab1 assigning <fs1> from lf_from_index.
if not ( <fs1>-matnr = <fs>- matnr and <fs1>-vbeln = <fs>-vbeln and
<fs1>-posnr = <fs>-posnr ).
exit.
endif.
<delete>
endloop.
endif.
endloop.
五,使用for all entry in的时候切记两点:使用DELETE ADJACENT DUPLICATES FROM删除从表中的重复记录,以及使用if not interanl table is initial判断主表是否为空,只要在主表不为空的情况下才执行。
今天先记录如下,没有经过整理的,凭着记忆写的,以后再补充.