一.嵌套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可使用标准表,但是一般情况没有优化要求的情况下,直接使用标准表即可