添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
1.最主要的是尽量减少I/O操作,然后是内存占用,再就是CPU的负载。CPU的负载可以通过优化程序来改善,在程序中尽量使用诸如SUM(SQL语句)或者COLLECT(ABAP语句)。
2.尽可能多地使用表的索引作为Where分句的条件选项,尽可能让程序只读取一定范围内的记录(比如说,你只准备操作一个月之内的业务数据,那么对于这一个月的业务就应该有一定的范围取值,如1000~2000)。
3.尽量使用Select A B C INTO TABLE ITAB这样的语句。这个操作会将所有符合条件的数据一次性地读进内表,这比在Select A B C INTO ITAB... ENDSELECT的循环中添加数据到内表要快。
4.尽可能使用Select SINGLE语句。
5.使用ABAP排序而不使用order by 。
6.可以使用视图来代表基本表的查询。
不推荐
  1. Select * from zcntry where cntry like ‘IN%’.
  2. Select single * from zflight where cntry = zcntry-cntry and airln = ‘LF’.
  3. Endselect.
复制代码
推荐
  1. Select * from zcnfl where cntry like ‘IN%’ and airln = ‘LF’.
  2. Endselect.
复制代码

7.可以使用一些聚合函数、GROUP BY …HAVING,来进行计算和分组统计,也可以来改善查询的效率。
不推荐
  1. Maxnu = 0.
  2. Select * from zflight where airln = ‘LF’ and cntry = ‘IN’.
  3. Check zflight-fligh > maxnu.
  4. Maxnu = zflight-fligh.
  5. Endselect.
复制代码
推荐
  1. Select max( fligh ) from zflight into maxnu where airln = ‘LF’ and cntry = ‘IN’.
复制代码
8.使用where语句
不推荐
  1. Select * from zflight.
  2. Check : zflight-airln = ‘LF’ and zflight-fligh = ‘BW222’.
  3. Endselect.
复制代码
推荐
  1. Select * from zflight where airln = ‘LF’ and fligh = ‘222’.
  2. Endselect.
复制代码
9.使用批量修改内表代替逐行修改
不推荐
  1. Loop at int_fligh.
  2. If int_fligh-flag is initial.
  3. Int_fligh-flag = ‘X’.
  4. Endif.
  5. Modify int_fligh.
  6. Endloop.
复制代码
推荐
  1. Int_fligh-flag = ‘X’.
  2. Modify int_fligh transporting flag where flag is initial.
复制代码
10.使用二分法查询,提高查询内表数据速度
不推荐
  1. Read table int_fligh with key airln = ‘LF’.
复制代码
推荐
  1. Read table int_fligh with key airln = ‘LF’ binary search.
复制代码

11.两个内表添加使用批量增加代替逐行
不推荐
  1. Loop at int_fligh1.
  2. Append int_fligh1 to int_fligh2.
  3. Endloop.
复制代码
推荐
  1. Append lines of int_fligh1 to int_fligh2.
复制代码
12.使用FOR ALL Entries
不推荐
  1. Loop at int_cntry.
  2. Select single * from zfligh into int_fligh where cntry = int_cntry-cntry.
  3. Append int_fligh.
  4. Endloop.
复制代码
推荐
  1. Select * from zfligh appending table int_fligh
  2. For all entries in int_cntry
  3. Where cntry = int_cntry-cntry.
复制代码
1 数据——>工作区,工作区——>内表,
2 数据——>内表
很明显少了一个过程 效率自然高了 如果数据量越大,效果是可想而知的
13.避免使用SELECT DISTINCT语句
使用的 ABAP SORT + DELETE ADJACENT DUPLICATES 代替.
14.更多地使用动态数据对象来访问内表。
不推荐:
  1. LOOP AT itab.
  2. READ TABLE itab_jest  WITH KEY objnr = itab-objnr.
  3. ENDLOOP.
复制代码
推荐:
  1. FIELD-SYMBOLS:<ls_itab> TYPE typ_jhgb.
  2. LOOP AT itab ASSIGNING <ls-itab>.
  3. READ TABLE itab_jest WITH KEY objnr = <ls-itab>-objnr.
  4. ENDLOOP.
复制代码
15.做好表的索引,这一点才是最关键的,在where 里,查询条件的顺序最好跟索引关键字一样,要不然你的索引就不起什么作用。
16.用OCCURS NUM_RECS声明内表,NUM_RECS参数是你估计(或希望)使用到的数据条数。如果使用到的记录条数超出NUM_RECS参数的限制,数据将被存放在硬盘上的交换空间(不是内存)。
17.内表使用完之后,应使用FREE来释放内存.
18.Field-groups(字段组)对于多层次的排序和显示是非常有用的。它是将数据写入系统的页面文件,而不是内存(内表是使用内存的)。基于这个原因,field-groups比较适合于处理大量数据的列表(一般超过50000条记录)。如果涉及大量的数据处理,应该首先和系统管理员协商来决定这个程序最多能使用多少内存,以计算这个程序需要使用多少资源。然后你就可以决定是把数据写入内存还是交换空间。
  1. field-groups:header.
  2. insert ... into header.
  3. do.
  4. ...
  5. extract header.
  6. enddo.
  7. sort descending.
  8. loop.
  9. ....
  10. write: ...
  11. endloop.
复制代码
19.LOOP/ENDLOOP里面使用READ TABLE...来读取另一内表,不要再使用LOOP/ENDLOOP来嵌套.LOOP/ENDLOOP处理内表数据,使用SUM/COLLECT来处理数值字段.
性能 , 程序 , 优化
  • ABAP内表是否使用Secondary Keys及排序内表的性能比较
  • ABAP内表语法Secondary Keys的用法
  • SAP实战中Submit的常见用法-调用标准程序
  • SAP 如何下载ABAP程序代码到本地
  • ABAP LOOP嵌套LOOP语句使用READ优化方法验证
  • ABAP select语句性能优化之高级教程
  • Select查询语句中LIKE关键词的优化方法分析
  •