浅谈性能调协–实例分析

原文地址: http://www.abaptech.com/bobo/?p=706

 

遇到一个程序,在开发环境中运行,速度虽然缓慢,可是还能最终运行出结果,可是在测试系统中,运行非常慢,更有甚者,无法出结果. 客户方提出需要做性能优化. 我大概看了一下程序,实时分析中发现数据库访问非常耗费时间,占总时间的90%以上,于是找到对应的程序段进行优化,并附以记录.

 

示例一:

表结构:

clip_image002

测试表记录总数: 150w左右

符合条件记录数: 8k左右

是否有副索引: 没有

程序段:

LOOP AT IT_DN .
  I_INDEX = SY - TABIX .
  SELECT SINGLE *
    FROM ZTOUTTRACKING
   WHERE Z_VBELN = IT_DN - VBELN
     AND Z_POSNR = IT_DN - POSNR
     AND Z_ZDTYP = 'R' .
  IF SY - SUBRC = 0 .
    DELETE IT_DN INDEX I_INDEX .
  ENDIF .
ENDLOOP .

该段程序执行时间: 40s左右

程序段分析:

1. 循环中嵌套SQL语句,增加了数据库访问次数

2. 使用了select *,而没有只抓去需要数据

3. 没有按照key去抓取数据,数据条件没有充分利用(因为z_lgnum为固定值)

第一次优化之后:

DATA : BEGIN OF LIT_Z1 OCCURS 0 ,
        Z_VBELN LIKE ZTOUTTRACKING - Z_VBELN ,
        Z_POSNR LIKE ZTOUTTRACKING - Z_POSNR ,
        Z_ZDTYP LIKE ZTOUTTRACKING - Z_ZDTYP ,
        Z_WERKS LIKE ZTOUTTRACKING - Z_WERKS ,
      END OF LIT_Z1 .
IF IT_DN[] IS NOT INITIAL .
  SELECT Z_WERKS Z_VBELN Z_POSNR Z_ZDTYP
    FROM ZTOUTTRACKING
    INTO CORRESPONDING FIELDS OF TABLE LIT_Z1
     FOR ALL ENTRIES IN IT_DN
   WHERE Z_LGNUM = G_LGNUM
     AND Z_ZDTYP = 'R'
     AND Z_VBELN = IT_DN - VBELN
     AND Z_POSNR = IT_DN - POSNR .
  IF SY - SUBRC = 0 .
    LOOP AT LIT_Z1 .
      DELETE IT_DN WHERE VBELN = LIT_Z1 - Z_VBELN
                     AND POSNR = LIT_Z1 - Z_POSNR .
    ENDLOOP .
  ENDIF .
ENDIF .

效果: 性能提升至25s左右

进一步分析:

1. For all entries使用中,没有保证IT_DN内表的条件记录数唯一

2. 数据选取中没有建立副索引

进一步优化:

1. 为表建立副索引

111

2. 增加IT_DN中选择数据条件的唯一

增加一个副内表, 将IT_DN中重复的选择数据记录删除,for all entries的条件用这个副内表,因为本程序中IT_DN的选择数据记录不可能重复,故无需此步骤.

进一步优化后效果:

该段程序执行时间在1s之内.

示例二:

原程序段:

FORM FRM_GET_LOCATION .
  DATA : V_PKSIZ TYPE C .
  DATA : V_CONTI TYPE C ,
        V_PALLET LIKE ZTPICK_PARA1 - Z_PALLET .
  RANGES : R_LPTYP FOR LAGP - LPTYP .

  DATA : BEGIN OF IT_LGTYP OCCURS 0 ,
          LGTYP LIKE LQUA - LGTYP ,
        END OF IT_LGTYP .
  DATA : V_EXIT TYPE C .
  SELECT SINGLE Z_VALUE INTO ZTHARDCODE - Z_VALUE FROM ZTHARDCODE WHERE Z_FUNCTION = C_PROG_NAME AND
  Z_FIELD = 'LGNUM' AND Z_PLANT = G_LGNUM .
  IF SY - SUBRC = 0 .
    SPLIT ZTHARDCODE - Z_VALUE AT '/' INTO TABLE IT_LGTYP .
    DELETE IT_LGTYP WHERE LGTYP = SPACE .
  ENDIF .

  LOOP AT IT_DN_BINTYP .
    CLEAR IT_STO_LOC .
    SELECT * FROM LQUA WHERE LGNUM = G_LGNUM AND MATNR = IT_DN_BINTYP - MATNR   AND
       SKZUA = '' AND BESTQ = '' AND SKZSI = '' AND SKZSA = '' .
      V_EXIT = '' .
      LOOP AT IT_LGTYP .
        IF LQUA - LGTYP CP IT_LGTYP - LGTYP .
          V_EXIT = C_X .
          EXIT .
        ENDIF .
      ENDLOOP .
      CHECK V_EXIT NE C_X .
      SELECT SINGLE * FROM LEIN WHERE LENUM = LQUA - LENUM AND SKZUA <> C_X .

      CHECK SY - SUBRC = 0 .
      V_CONTI = C_X .
      IF G_PC_PDC = C_PC AND ( LQUA - LGTYP = 'Z10' OR LQUA - LGTYP = 'Z11' ).
        V_CONTI = '' .
      ENDIF .
      CHECK V_CONTI = C_X .
      CLEAR IT_STO_LOC .
      IF IT_DN_BINTYP - LPTYP <> C_OVERSTRATGY .
      SELECT SINGLE BRAND INTO LAGP - LPTYP FROM LAGP WHERE LGNUM = LQUA - LGNUM AND LGTYP = LQUA - LGTYP AND
        LGPLA = LQUA - LGPLA AND BRAND = IT_DN_BINTYP - LPTYP AND SKZUA <> C_X AND SKZUA = '' AND SKZSI = '' AND SKZSA = '' .
      ELSE .
        REFRESH R_LPTYP .
        LOOP AT IT_DN_BINTYP WHERE MATNR = LQUA - MATNR .
          R_LPTYP - SIGN = 'I' .
          R_LPTYP - OPTION = 'EQ' .
          R_LPTYP - LOW = IT_DN_BINTYP - LPTYP .
          APPEND R_LPTYP .
        ENDLOOP .
        SELECT SINGLE BRAND INTO LAGP - LPTYP FROM LAGP WHERE LGNUM = LQUA - LGNUM AND LGTYP = LQUA - LGTYP AND
          LGPLA = LQUA - LGPLA AND NOT ( BRAND IN R_LPTYP ) AND SKZUA <> C_X AND SKZUA = '' AND SKZSI = '' AND SKZSA = '' .
        if sy - subrc = 0 .
          SELECT SINGLE Z_MBRS INTO ZTBINTYPE - Z_MBRS FROM ZTBINTYPE WHERE Z_LGNUM = G_LGNUM AND Z_LGTYP = LQUA - LGTYP AND
                                                    Z_BRAND = LAGP - LPTYP and Z_MBRS = C_MB .
          IF SY - SUBRC <> 0 .
            IF C_NUM CS LAGP - LPTYP + 0 (1 ).
              sy - subrc = 4 .
            ELSE .
              sy - subrc = 0 .
            ENDIF .
          else .
            sy - subrc = 0 .
          ENDIF .
        endif .
      ENDIF .
*<<<<
      IF SY - SUBRC = 0 .
        IF IT_DN_BINTYP - LPTYP <> C_OVERSTRATGY .
        SELECT SINGLE * FROM ZTPICK_PARA1 WHERE Z_LGNUM = LQUA - LGNUM AND Z_LGTYP = LQUA - LGTYP AND Z_LPTYP = LAGP - LPTYP AND
          Z_ZBTPSE = IT_DN_BINTYP - ZZBTPSE .
        ELSE .
        SELECT SINGLE * FROM ZTPICK_PARA1 WHERE Z_LGNUM = LQUA - LGNUM AND Z_LGTYP = LQUA - LGTYP AND Z_LPTYP = LAGP - LPTYP AND
          Z_ZBTPSE = IT_DN_BINTYP - ZZBTPSE .
        IF SY - SUBRC <> 0 .
        SELECT SINGLE * FROM ZTPICK_PARA1 WHERE Z_LGNUM = LQUA - LGNUM AND Z_LGTYP = LQUA - LGTYP AND Z_LPTYP = SPACE AND
          Z_ZBTPSE = IT_DN_BINTYP - ZZBTPSE .
        ENDIF .
        ENDIF .
        IF SY - SUBRC = 0 .
          IT_STO_LOC - Z_PICKSTG = ZTPICK_PARA1 - Z_PICKSTG .
          IT_STO_LOC - Z_PICKSTG = ZTPICK_PARA1 - Z_PICKSTG .
        ELSE .
          IT_STO_LOC - MESSAGE = TEXT - 044 .
          REPLACE '&1' WITH LQUA - LGNUM INTO   IT_STO_LOC - MESSAGE .
          REPLACE '&2' WITH LQUA - LGTYP INTO   IT_STO_LOC - MESSAGE .
          REPLACE '&3' WITH LAGP - LPTYP INTO   IT_STO_LOC - MESSAGE .
          REPLACE '&5' WITH IT_DN_BINTYP - ZZBTPSE INTO   IT_STO_LOC - MESSAGE .
          REPLACE '&6' WITH IT_DN_BINTYP - MATNR INTO   IT_STO_LOC - MESSAGE .
          CONDENSE IT_STO_LOC - MESSAGE .
          IT_STO_LOC - LQNUM = LQUA - LQNUM .   "Quant
          IT_STO_LOC - LGTYP = LQUA - LGTYP .   "Storage Type
          IT_STO_LOC - LPTYP = LAGP - LPTYP .   "Bin Type
          IT_STO_LOC - BINTYP = LAGP - LPTYP .
          COLLECT IT_STO_LOC .
          CLEAR IT_STO_LOC .
          CONTINUE .
        ENDIF .
        IT_STO_LOC - LQNUM = LQUA - LQNUM .   "Quant
        IT_STO_LOC - MATNR = LQUA - MATNR .   "Material
        IT_STO_LOC - LGTYP = LQUA - LGTYP .   "Storage Type
        IT_STO_LOC - ZZBTPSE = IT_DN_BINTYP - ZZBTPSE . " bin type sequence
        IT_STO_LOC - IND = IT_DN_BINTYP - IND .
        IT_STO_LOC - LPTYP = IT_DN_BINTYP - LPTYP .   "Bin Type
        IT_STO_LOC - LGPLA = LQUA - LGPLA .   "Bin
        IT_STO_LOC - VERME = LQUA - VERME .   "Available stock
        IT_STO_LOC - EINME = LQUA - EINME .   "putaway stock
        IT_STO_LOC - WDATU = LQUA - WDATU . "GR Date
        IT_STO_LOC - MEINS = LQUA - MEINS . " base unit
        IT_STO_LOC - BINTYP = LAGP - LPTYP .
        APPEND IT_STO_LOC .
        CLEAR IT_STO_LOC .
      ENDIF .
    ENDSELECT .
  ENDLOOP .
ENDFORM .                     " FRM_GET_LOCATION

程序段分析:

1. 循环中嵌套SQL语句,增加了数据库访问次数

2. 循环使用了select ...endselect, 更加加剧了数据库访问量

优化之后代码段:

FORM FRM_GET_LOCATION .
  DATA : V_PKSIZ TYPE C .
  DATA : V_CONTI TYPE C ,
        V_PALLET LIKE ZTPICK_PARA1 - Z_PALLET .
  RANGES : R_LPTYP FOR LAGP - LPTYP .
  DATA : BEGIN OF IT_LGTYP OCCURS 0 ,
          LGTYP LIKE LQUA - LGTYP ,
        END OF IT_LGTYP .
  DATA : V_EXIT TYPE C .
  SELECT SINGLE Z_VALUE INTO ZTHARDCODE - Z_VALUE FROM ZTHARDCODE WHERE Z_FUNCTION = C_PROG_NAME AND
  Z_FIELD = 'LGNUM' AND Z_PLANT = G_LGNUM .
  IF SY - SUBRC = 0 .
    SPLIT ZTHARDCODE - Z_VALUE AT '/' INTO TABLE IT_LGTYP .
    DELETE IT_LGTYP WHERE LGTYP = SPACE .
  ENDIF .

*start add by xuchunbo
  DATA : begin of LIT_LQUA OCCURS 0 ,
          lgnum like LQUA - lgnum ,
          lqnum like LQUA - LQNUM ,
          matnr like LQUA - MATNR ,
          lgtyp like LQUA - LGTYP ,
          lenum like LQUA - lenum ,
          lgpla like LQUA - LGPLA ,
          verme like LQUA - VERME ,
          einme like LQUA - EINME ,
          wdatu like LQUA - WDATU ,
          meins like LQUA - MEINS ,
          lptyp like lagp - BRAND ,
        end of lit_lqua .

  data : begin of lit_matnr OCCURS 0 , matnr like lqua - matnr , lptyp like lagp - brand , end of lit_matnr .
  data : wa like lit_matnr .
  loop at IT_DN_BINTYP .
    wa - matnr = IT_DN_BINTYP - matnr .
    at new matnr .
      append wa to lit_matnr .
    endat .
  endloop .

  SELECT a~lgnum a~lqnum a~matnr a~LGTYP a~lenum a~lqnum a~lgpla a~verme a~einme a~wdatu a~meins
         b~brand as lptyp
    FROM LQUA as a inner join lagp as b
      on a~lgnum = b~lgnum and a~lgtyp = b~lgtyp and a~lgpla = b~lgpla
      and a~skzua = b~skzua and a~skzsi = b~skzsi and a~skzsa = b~skzsa
    INTO corresponding fields of TABLE LIT_LQUA
    FOR ALL ENTRIES IN lit_matnr
    WHERE a~LGNUM = G_LGNUM AND a~MATNR = lit_matnr - MATNR   AND
          a~SKZUA = '' AND a~BESTQ = '' AND a~SKZSI = '' AND a~SKZSA = '' .

  delete LIT_LQUA where LPTYP = space .

  LOOP AT IT_LGTYP .
    DELETE LIT_LQUA WHERE LGTYP CP IT_LGTYP - LGTYP .
  ENDLOOP .

  IF G_PC_PDC = C_PC .
    DELETE LIT_LQUA WHERE ( LGTYP = 'Z10' OR LGTYP = 'Z11' ).
  ENDIF .

  DATA : BEGIN OF LIT_LEIN OCCURS 0 , LENUM LIKE LQUA - LENUM , END OF LIT_LEIN .
  RANGES : R_LENUM FOR LEIN - LENUM .
  SELECT LENUM FROM LEIN INTO TABLE LIT_LEIN FOR ALL ENTRIES IN LIT_LQUA WHERE LENUM = LIT_LQUA - LENUM AND SKZUA = c_x .
  if sy - subrc = 0 .
    loop at lit_lein .
      delete LIT_LQUA where lenum = LIT_LEIN - lenum .
    endloop .
  endif .

  TYPES : BEGIN OF TY_TEMP ,
          LGNUM LIKE LQUA - LGNUM ,
          LGTYP LIKE LQUA - LGTYP ,
          ZZBTPSE LIKE MLGN - ZZBTPSE , "#EC .., bzw. durch SET EXTENDED CHECK OFF
          MATNR LIKE LIPS - MATNR , "#EC .., bzw. durch SET EXTENDED CHECK OFF
          IND (6 )   TYPE N,
          LPTYP TYPE LVS_LPTYP ,
          LENUM LIKE LQUA - LENUM ,
          LQNUM LIKE LQUA - LQNUM ,
          LGPLA LIKE LQUA - LGPLA ,
          VERME LIKE LQUA - VERME ,
          EINME LIKE LQUA - EINME ,
          WDATU LIKE LQUA - WDATU ,
          MEINS LIKE LQUA - MEINS .
  TYPES : END OF TY_TEMP .
  DATA : LIT_TEMP TYPE TABLE OF TY_TEMP WITH HEADER LINE .
  DATA : LIT_TEMP1 TYPE TABLE OF TY_TEMP WITH HEADER LINE .
  DATA : BEGIN OF LIT_COND OCCURS 0 ,
          LGNUM LIKE LQUA - LGNUM ,
          LGTYP LIKE LQUA - LGTYP ,
          ZZBTPSE LIKE MLGN - ZZBTPSE , "#EC .., bzw. durch SET EXTENDED CHECK OFF
  END OF LIT_COND .
  DATA : BEGIN OF LIT_COND2 OCCURS 0 ,
          LGNUM LIKE LQUA - LGNUM ,
          LGTYP LIKE LQUA - LGTYP ,
          LGPLA LIKE LQUA - LGPLA ,
  END OF LIT_COND2 .
  DATA : LIT_COND1 LIKE LIT_COND OCCURS 0 WITH HEADER LINE .

  loop at LIT_LQUA .
    read table IT_DN_BINTYP with key matnr = LIT_LQUA - matnr LPTYP = LIT_LQUA - LPTYP .
    if sy - subrc = 0 .
      MOVE-CORRESPONDING LIT_LQUA TO LIT_TEMP .
      MOVE-CORRESPONDING IT_DN_BINTYP TO LIT_TEMP .
      append lit_temp .

      LIT_COND - LGNUM = G_LGNUM .
      LIT_COND - LGTYP = LIT_LQUA - LGTYP .
      LIT_COND - ZZBTPSE = IT_DN_BINTYP - ZZBTPSE .
      APPEND LIT_COND .
    else .
      read table IT_DN_BINTYP with key matnr = LIT_LQUA - matnr LPTYP = C_OVERSTRATGY .
      if sy - subrc = 0 .
        MOVE-CORRESPONDING LIT_LQUA TO LIT_TEMP .
        MOVE-CORRESPONDING IT_DN_BINTYP TO LIT_TEMP .
        append lit_temp .
        LIT_COND - LGNUM = G_LGNUM .
        LIT_COND - LGTYP = LIT_LQUA - LGTYP .
        LIT_COND - ZZBTPSE = IT_DN_BINTYP - ZZBTPSE .
        APPEND LIT_COND .
      endif .
    endif .
    LIT_COND2 - LGNUM = G_LGNUM .
    LIT_COND2 - LGTYP = LIT_LQUA - LGTYP .
    LIT_COND2 - LGPLA = LIT_LQUA - LGPLA .
    APPEND LIT_COND2 .
  endloop .
  SORT LIT_TEMP by matnr ind .
  LIT_TEMP1[] = LIT_TEMP[] .
  SORT LIT_COND BY LGNUM LGTYP ZZBTPSE .
  LIT_COND1[] = LIT_COND[] .
  DELETE ADJACENT DUPLICATES FROM LIT_COND COMPARING ALL FIELDS .
  DELETE ADJACENT DUPLICATES FROM LIT_COND1 COMPARING LGNUM LGTYP .
  SORT LIT_COND2 .
  DELETE ADJACENT DUPLICATES FROM LIT_COND2 COMPARING ALL FIELDS .

  DATA : BEGIN OF LIT_LA1 OCCURS 0 , LGNUM LIKE LAGP - LGNUM , LGTYP LIKE LAGP - LGTYP , LGPLA LIKE LAGP - LGPLA , BRAND LIKE LAGP - BRAND , END OF LIT_LA1 .

  IF LIT_COND2[] IS NOT INITIAL .
    SELECT LGNUM LGTYP LGPLA BRAND FROM LAGP INTO TABLE LIT_LA1 FOR ALL ENTRIES IN LIT_COND2
             WHERE LGNUM = LIT_COND2 - LGNUM AND LGTYP = LIT_COND2 - LGTYP AND
            LGPLA = LIT_COND2 - LGPLA AND SKZUA = '' AND SKZSI = '' AND SKZSA = '' .
  ENDIF .

  DATA : BEGIN OF LIT_MBRS OCCURS 0 , Z_LGNUM LIKE ZTBINTYPE - Z_LGNUM , Z_LGTYP LIKE ZTBINTYPE - Z_LGTYP , Z_BRAND LIKE ZTBINTYPE - Z_BRAND ,
          z_mbrs like ZTBINTYPE - z_mbrs ,
        END OF LIT_MBRS .
  IF LIT_COND1[] IS NOT INITIAL .
    SELECT Z_LGNUM Z_LGTYP Z_BRAND z_mbrs FROM ZTBINTYPE INTO TABLE LIT_MBRS FOR ALL ENTRIES IN LIT_COND1
    WHERE Z_LGNUM = G_LGNUM AND Z_LGTYP = LIT_COND1 - LGTYP AND Z_MBRS = C_MB .
  ENDIF .

  DATA : BEGIN OF LIT_ZTP OCCURS 0 , Z_LGNUM LIKE ZTPICK_PARA1 - Z_LGNUM , Z_LGTYP LIKE ZTPICK_PARA1 - Z_LGTYP , Z_LPTYP LIKE ZTPICK_PARA1 - Z_LPTYP , Z_ZBTPSE LIKE
  ZTPICK_PARA1 - Z_ZBTPSE , Z_PICKSTG LIKE ZTPICK_PARA1 - Z_PICKSTG , END OF LIT_ZTP .
  IF LIT_COND[] IS NOT INITIAL .
    SELECT Z_LGNUM Z_LGTYP Z_LPTYP Z_ZBTPSE Z_PICKSTG FROM ZTPICK_PARA1 INTO TABLE LIT_ZTP FOR ALL ENTRIES IN LIT_COND
    WHERE Z_LGNUM = LIT_COND - LGNUM AND Z_LGTYP = LIT_COND - LGTYP AND
          Z_ZBTPSE = LIT_COND - ZZBTPSE .
  ENDIF .
*end add by xuchunbo
  LOOP AT LIT_TEMP .

    CLEAR IT_STO_LOC .
    IF LIT_TEMP - LPTYP <> C_OVERSTRATGY .
      LAGP - LPTYP = LIT_TEMP - lptyp .
    ELSE .
      REFRESH R_LPTYP .
      LOOP AT LIT_TEMP1 WHERE MATNR = LIT_TEMP - MATNR .
        R_LPTYP - SIGN = 'I' .
        R_LPTYP - OPTION = 'EQ' .
        R_LPTYP - LOW = LIT_TEMP1 - LPTYP .
        APPEND R_LPTYP .
      ENDLOOP .
      sort R_LPTYP .
      delete ADJACENT DUPLICATES FROM R_LPTYP COMPARING ALL FIELDS .
      LOOP AT LIT_LA1 WHERE lgnum = LIT_TEMP - lgnum and LGTYP = LIT_TEMP - LGTYP and LGPLA = LIT_TEMP - LGPLA
         and NOT ( BRAND IN R_LPTYP ).
        LAGP - LPTYP = LIT_LA1 - BRAND .
        EXIT .
      ENDLOOP .
      IF SY - SUBRC = 0 .
        READ TABLE LIT_MBRS WITH KEY Z_LGNUM = G_LGNUM Z_LGTYP = LIT_TEMP - LGTYP Z_BRAND = LAGP - LPTYP .
        IF SY - SUBRC <> 0 .
          IF C_NUM CS LAGP - LPTYP + 0 (1 ).
            SY - SUBRC = 4 .
          ELSE .
            SY - SUBRC = 0 .
          ENDIF .
        ELSE .
          SY - SUBRC = 0 .
          ZTBINTYPE - Z_MBRS = lit_mbrs - z_mbrs .
        ENDIF .
      ENDIF .
    ENDIF .
    IF SY - SUBRC = 0 .
      IF LIT_TEMP - LPTYP <> C_OVERSTRATGY .
        READ TABLE LIT_ZTP WITH KEY Z_LGNUM = LIT_TEMP - LGNUM Z_LGTYP = LIT_TEMP - LGTYP Z_LPTYP = LAGP - LPTYP Z_ZBTPSE = LIT_TEMP - ZZBTPSE .
      ELSE .
        READ TABLE LIT_ZTP WITH KEY Z_LGNUM = LIT_TEMP - LGNUM Z_LGTYP = LIT_TEMP - LGTYP Z_LPTYP = LAGP - LPTYP Z_ZBTPSE = LIT_TEMP - ZZBTPSE .
        IF SY - SUBRC <> 0 .
          READ TABLE LIT_ZTP WITH KEY Z_LGNUM = LIT_TEMP - LGNUM Z_LGTYP = LIT_TEMP - LGTYP Z_LPTYP = SPACE Z_ZBTPSE = LIT_TEMP - ZZBTPSE .
        ENDIF .
      ENDIF .
      IF SY - SUBRC = 0 .
        IT_STO_LOC - Z_PICKSTG = LIT_ZTP - Z_PICKSTG .
      ELSE .
        IT_STO_LOC - MESSAGE = TEXT - 044 .
        REPLACE '&1' WITH LIT_TEMP - LGNUM INTO   IT_STO_LOC - MESSAGE .
        REPLACE '&2' WITH LIT_TEMP - LGTYP INTO   IT_STO_LOC - MESSAGE .
        REPLACE '&3' WITH LAGP - LPTYP INTO   IT_STO_LOC - MESSAGE .
        REPLACE '&5' WITH LIT_TEMP - ZZBTPSE INTO   IT_STO_LOC - MESSAGE .
        REPLACE '&6' WITH LIT_TEMP - MATNR INTO   IT_STO_LOC - MESSAGE .
        CONDENSE IT_STO_LOC - MESSAGE .
        IT_STO_LOC - LQNUM = LIT_TEMP - LQNUM .   "Quant
        IT_STO_LOC - LGTYP = LIT_TEMP - LGTYP .   "Storage Type
        IT_STO_LOC - LPTYP = LAGP - LPTYP .   "Bin Type
        IT_STO_LOC - BINTYP = LAGP - LPTYP .
        COLLECT IT_STO_LOC .
        CLEAR IT_STO_LOC .
        CONTINUE .
      ENDIF .
      IT_STO_LOC - LQNUM = LIT_TEMP - LQNUM .   "Quant
      IT_STO_LOC - MATNR = LIT_TEMP - MATNR .   "Material
      IT_STO_LOC - LGTYP = LIT_TEMP - LGTYP .   "Storage Type
      IT_STO_LOC - ZZBTPSE = LIT_TEMP - ZZBTPSE . " bin type sequence
      IT_STO_LOC - IND = LIT_TEMP - IND .
      IT_STO_LOC - LPTYP = LIT_TEMP - LPTYP .   "Bin Type
      IT_STO_LOC - LGPLA = LIT_TEMP - LGPLA .   "Bin
      IT_STO_LOC - VERME = LIT_TEMP - VERME .   "Available stock
      IT_STO_LOC - EINME = LIT_TEMP - EINME .   "putaway stock
      IT_STO_LOC - WDATU = LIT_TEMP - WDATU . "GR Date
      IT_STO_LOC - MEINS = LIT_TEMP - MEINS . " base unit
      IT_STO_LOC - BINTYP = LAGP - LPTYP .
      APPEND IT_STO_LOC .
      CLEAR IT_STO_LOC .
    ENDIF .
  ENDLOOP .
ENDFORM .                     " FRM_GET_LOCATION

效果: 原程序已经无法运行完成,优化后,执行时间为65s左右(数据量在接近亿计数,非常庞大)

总结之程序优化原则:

  1. 首先从业务逻辑分析,让顾问尽量缩减处理数据量(比如条件必 输,或者其他限制等等), 可以有效减少abaper工作量
  2. 不能改变原程序逻辑
  3. 避免循环中嵌套SQL语句
  4. 绝对避免select...endselect循环处理
  5. 避免select *
  6. 使用for all entries注意: 条件表不能为空, 删除条件表中重复的记录
  7. 数据量庞大可以使用hashed表(本程序没有使用是因为逻辑 复杂,并且用户接受最终调试结果,否则.....俺要进一步了)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值