浅谈性能调协–实例分析

clip_image002_thumb.jpg


遇到一个程序,在开发环境中运行,速度虽然缓慢,可是还能最终运行出结果,可是在测试系统中,运行非常慢,更有甚者,无法出结果. 客户方提出需要做性能优化. 我大概看了一下程序,实时分析中发现数据库访问非常耗费时间,占总时间的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表(本程序没有使用是因为逻辑复杂,并且用户接受最终调试结果,否则…..俺要进一步了)


About The Author

从事SAP行业有些年头,对SAP技术稍有了解; 如无特别声明,本博客文章为原创,转载请注明; 博主MSN:xuchunbo0901@hotmail.com; 博主邮箱:bob.xu@abaptech.com。

No Comments

Leave A Reply


注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。

无觅相关文章插件,快速提升流量