ABAP 嵌套LOOP優化


一.嵌套LOOP優化
1.內層內表的定義方式改為SORTED TABLE,速度會比標准表快一半
一般優化方式:(TAB1中為學生名單,TAB2中為學生各科考試成績)

 1 LOOP AT TAB1.
 2 
 3 READ TABLE TAB2 WITH KEY 學號 = TAB1-學號 BINARY SEARCH TRANSPORTING NO FILEDS.
 4 
 5 LOOP AT TAB2 FROM SY-TABIX.
 6 
 7 IF TAB2-學號 <> TAB1-學號.
 8 
 9 EXIT.
10 
11 ENDIF.
12 
13 "其他處理...
14 
15 ENDLOOP.
16 
17 ENDLOOP.
View Code

2.先匯總嵌套LOOP數據,再LOOP中嵌套READ就行(內層內表數據量越大,越適用)
*可以匯總的前提是:

  1.再嵌套內表中只需要按條件查找到一條數據時
  (例如查找到內層內表某個字段的最小值,最大值,匯總值等,總之內層內表經過數據處理可以變成外層內表WHERE內層內表的條件的唯一條目時,一定要先對內層內表進行數據處理)
  2.不可匯總的情況,比如循環head表,再嵌套LOOP循環ITEM表,得到明細數據等

(1)先處理嵌套內表為一條匯總數據,再去LOOP中READ,定義TAB3,包含學號和成績。
    外層LOOP中TAB3應為標准表,嵌套內表采用哈希表最快,其次是用排序表,采用二分法

 1 LOOP AT TAB2.
 2 
 3 TAB3-學號 = TAB2-學號.
 4 
 5 TAB3-成績 = TAB2-成績.
 6 
 7 COLLECT TAB3.
 8 
 9 ENDLOOP.
10 
11 SORT TAB3 BY 學號.
12 
13 LOOP AT TAB1.
14 
15 READ TAB3 WITH KEY 學號 = TAB1-學號 BINARY SEARCH.
16 
17 "其他處理
18 
19 ENDLOOP.
View Code

(2)當LOOP(定義為排序表)中存在按照不同條件字段多次取同一個內表數據時(loop……endloop中並列的有好幾組LOOP時)
a.先按照每組條件把內層LOOP內表排序,去重,依次放到各個臨時表中
b.READ按條件不同查找對應的唯一鍵臨時表(哈希表或者排序表),但其實一般數據量的優化,用標准表二分法即可!
另外READ時采用截取字段作為條件,是不影響速度的
c.在其中按條件由小到大遞進READ多個臨時表時,應先判斷最可能發生的情況能否READ到,READ不到就退出循環,減少READ次數

eg.比如循環spfli表,從SFLIGHT表中按carrid,connid,fldate取PRICE最低的數據,如果取不到,
             就取按ccarrid,connid,fldate+0(6)取PRICE最低的數據,如果取不到,
                就取按carrid,connid,取PRICE最低的數據,如果再取不到,
                就取按carrid取PRICE最低的數據,

  • 一般情況下,直接嵌套循環是不可取的,應該先處理SFLIGHT中的數據,找出各個條件的price最低數據,先對SPLIGHT按carrid,connid,fldate,price進行升序,再按照carrid,connid,fldate去重,再按照carrid,connid,fldate+0(6),price進行升序,再按照carrid,connid,fldate+0(6)去重,再將剩余數據放在lt_1中,再進行carrid,connid,price升序,carrid,connid去重,再將剩余數據放在lt_2中,再進行carrid,price升序,carrid去重,
  • 然后再循環中去,先去READ最可能出現的情況,check sy-subrc = 0,再繼續執行,則按split中carrid,connid,fldate+0(6)再READ sflight,read不到就continue,再按split中carrid,connidread去READ lt_1,以此類推


二.loop 嵌套READ的優化
LOOP可使用SORT表,READ可使用哈希表,APPEND可使用標准表,但是一般情況沒有優化要求的情況下,直接使用標准表即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM