ABAP performance学习笔记

来源:互联网 发布:火锅店收银软件 编辑:程序博客网 时间:2024/06/06 03:57
去年的时候进行了一下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 transportingno 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>-vbelnand
               <fs1>-posnr = <fs>-posnr ).
        exit.
      endif.
      <delete>
    endloop.
 endif.
endloop.

  五,使用for all entry in的时候切记两点:使用DELETE ADJACENT DUPLICATES FROM删除从表中的重复记录,以及使用if not interanl table is initial判断主表是否为空,只要在主表不为空的情况下才执行。

  今天先记录如下,没有经过整理的,凭着记忆写的,以后再补充.

0 0
原创粉丝点击