第一部分:大幅提高運行速度的方法
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判斷,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/255956.html
標籤:其他
上一篇:有關慢uri優化,慢Sql優化
下一篇:不同電腦上查詢回傳結果不同
