每個ABAP在寫代碼的時候,我們都不可避免的要使用到嵌套循環,雖然我們有時候能避免掉,也有無可避免的時候,這個時候就體現我們開發人員的經驗和水平的時候。
如何更快的提升ABAP程序的性能,我們開始分析一下如下的代碼:
REPORT ZABAPHOME.
TYPES: STR_VBAK TYPE STANDARD TABLE OFVBAK.
DATA: IT_VBAK TYPE STR_VBAK .
DATA: WA_VBAK LIKE LINE OF IT_VBAK.
TYPES: STR_VBAP TYPE STANDARD TABLE OFVBAP.
DATA: IT_VBAP TYPE STR_VBAP.
DATA: WA_VBAP LIKE LINE OF IT_VBAP.
SELECT* FROM VBAK
INTO TABLE IT_VBAK
UP TO 5000 ROWS.
CHECK IT_VBAK IS NOT INITIAL.
SELECT * FROM VBAP
INTO TABLE IT_VBAP
FOR ALL ENTRIES IN IT_VBAK
WHERE VBELN = IT_VBAK-VBELN.
*
DATA: LV_START_TIME TYPE TIMESTAMPL,
LV_END_TIME TYPE TIMESTAMPL,
LV_DIFF TYPE TIMESTAMPL.
DATA: LV_TABIX TYPE I.
GET TIME STAMP FIELD LV_START_TIME.
LOOP AT IT_VBAK INTO WA_VBAK.
LOOP AT IT_VBAP INTO WA_VBAP
WHERE VBELN = WA_VBAK-VBELN.
ENDLOOP.
ENDLOOP.
GET TIME STAMP FIELD LV_END_TIME.
LV_DIFF = LV_END_TIME - LV_START_TIME.
WRITE: /(50) '普通循環時間:', LV_DIFF.
**--重點代碼來了
CLEAR: LV_START_TIME, LV_END_TIME,LV_DIFF.
GET TIME STAMP FIELD LV_START_TIME.
**首先要排序
SORT: IT_VBAK BY VBELN,
IT_VBAP BY VBELN.
LOOP AT IT_VBAK INTO WA_VBAK.
**--Read到對應的TABIX
READ TABLE IT_VBAP TRANSPORTING NO FIELDS
WITH KEY VBELN = WA_VBAK-VBELN BINARY SEARCH.
if sy-subrc = 0.
LV_TABIX = SY-TABIX.
**然后根據TABIX來循環
LOOP AT IT_VBAP FROM LV_TABIX INTO WA_VBAP.
IF WA_VBAP-VBELN <> WA_VBAK-VBELN.
EXIT.
ENDIF.
這里需要操作的代碼塊。
ENDLOOP.
endif.
ENDLOOP.
GET TIME STAMP FIELD LV_END_TIME.
LV_DIFF = LV_END_TIME - LV_START_TIME.
WRITE: /(50)'read循環后時間分析', LV_DIFF.
執行100條數據:
SELECT * FROM VBAK INTO TABLE IT_VBAK UP TO 100 ROWS.
結果:
執行1000條數據:
SELECT * FROM VBAK INTO TABLE IT_VBAK UP TO 1000 ROWS.
結果:
執行5000條數據:
SELECT * FROM VBAK INTO TABLE IT_VBAK UP TO 5000 ROWS.
結果:
執行10000條數據:
SELECT * FROM VBAK INTO TABLE IT_VBAK UP TO 10000 ROWS.
結果:
來點極限數據看看
SELECT * FROM VBAK INTO TABLE IT_VBAK UP TO 100000 ROWS.