SAP-ABAP-运行速度优化

第一部分:大幅提高运行速度的方法

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判断。

 

 

 

 

 

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值