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