ABAP Coding Rule-Part 3-ABAP4 Performance Tuning
6.ABAP4 Performance Tuning
6.1使用PK(Primary Key)
每个Table都有一个PK,当使用到PK进行资料索引时,DB触发Index unique scan,达到数据索引的最佳效能。请尽量使用TABLE的Primary Key Value,并且尽量把所有的Key Value都包括在Where条件里,即使这些值在你看来是固定的。
例:Table:BSEG的Key值为BUKRS,BELNR,GJAHR,BUZEI,但是用BUKRS,BELNR这两项也一样可以找到唯一的一条记录,但是如果你只用这两项去Select,有可能跑到超时也查不到一条记录。
修正前
SELECT ZUONR INTO ITAB-ZUONR FROM BSEG WHERE BUKRS = BKPF-BUKRS
AND BELNR = ITAB-BELNR.
……………
ENDSELECT.
修正后
SELECT ZUONR INTO ITAB-ZUONR FROM BSEG WHERE BUKRS = BKPF-BUKRS
AND BELNR = ITAB-BELNR
AND GJAHR = BKPF-GJAHR
AND BUZEI = '1'.
……………
ENDSELECT.
6.2使用索引Index
当下Where条件的时候,请使用Index,而且要保证Where里的多个条件的顺序与Index的定义顺序一致。
例:修正前
SELECT VBELN ERDAT INTO (VBFA-VBELN, VBFA-ERDAT) FROM VBFA
WHERE VBTYP_N = 'R'
AND VBELV = VBAK-VBELN
AND VBTYP_V = 'C' .
…………
ENDSELECT.
例:修正后(因为VBFA的Index的定义顺序为VBELV,VBTYP_N,VBTYP_V)
SELECT VBELN ERDAT INTO (VBFA-VBELN, VBFA-ERDAT) FROM VBFA
WHERE VBELV = VBAK-VBELN
AND VBTYP_N = 'R'
AND VBTYP_V = 'C' .
…………
ENDSELECT.
6.3 直接使用内表存放数据 Select ... Into Table
例:修正前
data t006_wa type t006.
clear x006.
select * from t006 into t006_wa.
append t006_wa to x006.
endselect.
修正后:
select * from t006 into table x006.
6.4多层SELECT-ENDSELECT
当第一层SELECT数据量大时,请先将其读入Internal Table,然后Loop Internal Table进行后续处理,另外请注意,不要在SELECT和ENDSELECT之间夹入过多的处理逻辑,最好只做简单的数据筛选,将筛选出的数据放入Internal Table,然后再对Internal Table进行处理。
例:修正前
SELECT VBELN ERDAT AUART FROM VBAK WHERE ERDAT IN S_DAT.
SELECT .....
............
ENDSELECT.
ENDSELECT.
例:修正后
SELECT VBELN ERDAT AUART FROM VBAK INTO CORRESPONDING FIELDS OF
TABLE I_VBAK WHERE ERDAT IN S_DAT.
LOOP AT I_VBAK.
SELECT………
……………
ENDSELECT.
ENDLOOP.
6.5“*”号的使用
当下Selct语句的时候,禁止使用“*”号,而是只Select你需要的栏位,即便是Select全部栏位。
例:修正前
SELECT * FROM KNA1 WHERE KTOKD = P_KTOKD.
WRITE : KNA1-KUNNR,
KNA1-NAME1,
KNA1-TELF1.
ENDSELECT.
例:修正后
SELECT KUNNR NAME1 TELF1 FROM KNA1
INTO WA_WKNA1
WHERE KTOKD = P_KTOKD.
WRITE : WA_WKNA1-KUNNR,
WA_WKNA1-NAME1,
WA_WKNA1-TELF1.
ENDSELECT.
6.6COMMIT WORK
当你的程序里有INSERT, UPDATE, or DELETE命令时,请一定在它的后面加上COMMIT WORK语句。并且请不要把INSERT, UPDATE, or DELETE命令放在SELECT …..ENDSELECT之间,如果要有条件的INSERT, UPDATE, or DELETE记录,请把条件放在这些命令的条件选择语句里,如WHERE条件。
例:修正前
INSERT ZMMI2 FROM TABLE I_ZMMI2.
例:修正后
INSERT ZMMI2 FROM TABLE I_ZMMI2.
COMMIT WORK.
6.7 Internal Table性能提示
如果你需要把一个Interial Table的所有记录移动到另一个结构相同的Internal Table,请用下面的语句,而不要用Loop的方式一条一条赋值:
ITAB2[ ] = ITAB1[ ].
如果你是要把一个Interial Table的一条记录追加到另一个结构相同的Internal Table,请用下面的语句,而不要一个栏位一个栏位的赋值:
APPEND LINES OF ITAB1 TO ITAB2.
6.8 SORT 性能提示
在使用READ TABLE WITH KEY …….时,请先SORT这个Table,这样可以使你更快的找到你要的数据。
6.9 Header Line 性能提示
在使用SELECT SINGLE 或 READ TABLE ITAB去查询数据前,请先用CLEAR清除Header Line。
例:修正前
SELECT SINGLE KBETR WAERS KPEIN KSCHL FROM KONV
INTO CORRESPONDING FIELDS OF KONV
WHERE KNUMV = ITAB-KNUMV
AND KPOSN = ITAB-POSNR.
例:修正后
CLEAR: KONV.
SELECT SINGLE KBETR WAERS KPEIN KSCHL FROM KONV
INTO CORRESPONDING FIELDS OF KONV
WHERE KNUMV = ITAB-KNUMV
AND KPOSN = ITAB-POSNR.
6.10 CHECK的使用
当需要判断条件时,优先选择CHECK而不是IF条件。但是当用LOOP的方式去筛选数据时,优先选择LOOP…..WHERE ,而不是LOOP整个Table再用CHECK去筛选。
例:修正前
SELECT VBELN ERDAT AUART FROM VBAK INTO CORRESPONDING FIELDS OF
TABLE I_VBAK WHERE ERDAT IN S_DAT.
IF SY-SUBRC <> 0 .
MESSAGE S501 WITH 'No data found !!!' .
EXIT.
ENDIF.
LOOP AT I_VBAK.
IF I_VBAK-AUART = 'TA'.
…………
ENDIF.
ENDLOOP.
ENDSELECT.
例:修正后
SELECT VBELN ERDAT AUART FROM VBAK INTO CORRESPONDING FIELDS OF
TABLE I_VBAK WHERE ERDAT IN S_DAT.
IF SY-SUBRC <> 0 .
MESSAGE S501 WITH 'No data found !!!' .
EXIT.
ENDIF.
LOOP AT I_VBAK.
CHECK I_VBAK-AUART = 'TA'.
…………
ENDLOOP.
ENDSELECT.
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号