一.嵌套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.
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.
(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可使用標准表,但是一般情況沒有優化要求的情況下,直接使用標准表即可