原文地址: http://www.abaptech.com/bobo/?p=706
遇到一个程序,在开发环境中运行,速度虽然缓慢,可是还能最终运行出结果,可是在测试系统中,运行非常慢,更有甚者,无法出结果. 客户方提出需要做性能优化. 我大概看了一下程序,实时分析中发现数据库访问非常耗费时间,占总时间的90%以上,于是找到对应的程序段进行优化,并附以记录.
示例一:
表结构:
测试表记录总数: 150w左右
符合条件记录数: 8k左右
是否有副索引: 没有
程序段:
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为固定值)
第一次优化之后:
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. 为表建立副索引
2. 增加IT_DN中选择数据条件的唯一
增加一个副内表, 将IT_DN中重复的选择数据记录删除,for all entries的条件用这个副内表,因为本程序中IT_DN的选择数据记录不可能重复,故无需此步骤.
进一步优化后效果:
该段程序执行时间在1s之内.
示例二:
原程序段:
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, 更加加剧了数据库访问量
优化之后代码段:
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左右(数据量在接近亿计数,非常庞大)
总结之程序优化原则:
- 首先从业务逻辑分析,让顾问尽量缩减处理数据量(比如条件必 输,或者其他限制等等), 可以有效减少abaper工作量
- 不能改变原程序逻辑
- 避免循环中嵌套SQL语句
- 绝对避免select...endselect循环处理
- 避免select *
- 使用for all entries注意: 条件表不能为空, 删除条件表中重复的记录
- 数据量庞大可以使用hashed表(本程序没有使用是因为逻辑 复杂,并且用户接受最终调试结果,否则.....俺要进一步了)