ABAP Coding Rule-Part 3-ABAP4 Performance Tuning

6.ABAP4 Performance Tuning

6.1使用PK(Primary Key)

每个Table都有一个PK,当使用到PK进行资料索引时,DB触发Index unique scan,达到数据索引的最佳效能。请尽量使用TABLEPrimary Key Value,并且尽量把所有的Key Value都包括在Where条件里,即使这些值在你看来是固定的。

 

例:Table:BSEGKey值为BUKRSBELNRGJAHRBUZEI,但是用BUKRSBELNR这两项也一样可以找到唯一的一条记录,但是如果你只用这两项去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.

 

例:修正后(因为VBFAIndex的定义顺序为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进行后续处理,另外请注意,不要在SELECTENDSELECT之间夹入过多的处理逻辑,最好只做简单的数据筛选,将筛选出的数据放入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.

posted @ 2011-08-21 22:46  VerySky  阅读(362)  评论(0)    收藏  举报