第一部分:大幅提高运行速度的方法
1.READ TABLE 使用二分法,数据量越大,优化的速度越大
原代码
READ TABLE GT_MARA WITH KEY MATNR = '000' INTO DATA(GS_MARA) .
改为
SORT GT_MARA BY MATNR .
READ TABLE GT_MARA WITH KEY MATNR = '000' INTO DATA(GS_MARA) BINARY SEARCH .
2.LOOP 循环某些特定的行,不需要循环所有行时。先排序,用二分法找到具体在哪然后用LOOP FROM 语句代替原来的语句
原代码
LOOP AT GT_MARA WHERE MATNR = '000' INTO GS_MARA .
ENDLOOP .
改为
SORT GT_MARA BY MATNR .
READ TABLE GT_MARA WITH KEY MATNR = '000' INTO GS_MARA BINARY SEARCH .
IF SY-SUBRC = 0 .
LOOP AT GT_MARA FORM SY-TABIX INTO GS_MARA .
IF GS_MARA-MATNR <> '000' .
EXIT .
ENDIF .
ENDLOOP .
ENDIF .
上面这种修改的方法尤其适合在LOOP循环中套LOOP循环的情况,若两个内表数据量都只有一万,LOOP套LOOP就有一亿次运算,而其中大部分都是不需要的,用上面的优化方法可以精确找到具体哪行需要修改,避免浪费
3.使用FOR ALL ENTRIES 时 一定要判断内表不是空的,否则会将所有数据都取出来。这点如果要求严格点的话算程序BUG,不算代码优化
原代码
SELECT * FORM MARC FOR ALL ENTRIES IN GT_MARA
WHERE MARC~MATNR = @GT_MARA-MATNR
INTO @DATA(GT_MARC) .
优化后
IF GT_MARA IS NOT INITIAL .
SELECT * FORM MARC FOR ALL ENTRIES IN GT_MARA
WHERE MARC~MATNR = @GT_MARA-MATNR
INTO @DATA(GT_MARC) .
ENDIF .
4.LOOP 中嵌套SELECT,没错循环都会需数据库交互一次,改为全部取出从内表READ 更好
原代码
LOOP AT GT_MARA WHERE MATNR = '000' INTO GS_MARA .
SELECT SINGLE MAKT~MAKTX FORM MAKT WHERE MATNR = GS_MARA-MATNR AND SPARS = SY-LANGE INTO GS_MARA-MAKTX .
ENDLOOP .
改为
IF GT_MARA IS NOT INITIAL .
SELECT MATNR MAKTX FORM MAKT FOR ALL ENTRIES IN GT_MARA
WHERE MATNR = @GT_MARA-MATNR
AND SPARS = SY-LANGE
INTO @DATA(GT_MAKT) .
ENDIF .
SORT GT_MAKT BY MATNR .
LOOP AT GT_MARA WHERE INTO GS_MARA .ENDLOOP .
READ TABLE GT_MAKT WITH KEY MATNR = GS_MARA-MATNR INTO GS_MARA-MAKTX BINARY SEARCH .
ENDLOOP .
此处修改两种方法代码量差异很大,优化速度随着内表行数递增,内表行数越多提速越快。
第二部分:少量提速的点,熟练使用养成良好的代码习惯
1.循环嵌套时循环次数少的放在外循环,数量多的放在内循环。
2.判断语句,几率高的放在前面
3.MODIFY 内表时使用TRANSPORTING读取或修改具体需要的字段
4.LOOP循环将数据插入另一个内表时改为INSERT GT_TAB 或者APPEND LINES OF .
5.使用完变量及时清空释放内存,同时也可避免循环未清空导致数据错误的情况。
6.LOOP循环加WHERE条件代替循环中使用IF判断。