SAP优化

一、降低CPU负载 1.尽量避免使用MOVE-CORRESPONDING 和 INTO CORRESPONDING FIELDS OF. CORRESPONDING语句在系统内部存在隐式操作: a. 检查元素名称匹配; b. 检查元素类型匹配; c.元素类型转换;
  SELECT vbeln posnr INTO TABLE itab  FROM vbak WHERE vbeln = p_vbeln. Itab2 = itab1. 推荐
  SELECT vbeln as fld1 posnr as fld2 INTO TABLE itab  FROM vbak WHERE vbeln = p_vbeln.   LOOP AT itab1 INTO wa.     Itab2-fld1 = wa-matnr.     Itab2-fld2 = wa-meins     APPEND itab2. ENDLOOP. 推荐
  SELECT *  INTO CORRESPONDING  FIELDS OF TABLE itab FROM vbak  WHERE vbeln = p_vbeln.   LOOP AT itab1 INTO wa.     MOVE-CORRESPONDING wa to itab2.     APPEND itab2. ENDLOOP. 不推荐
  2.使用BINARY search 二分查找算法 一般线性查找的缺点就是耗时, 而二分查找比线性查找更高效. 注意: 使用BINARY SEARCH前必须对内表进行按索引排序.
  SORT TABLE itab2 BY vbeln posnr. READ TABLE itab2 WITH KEY  vbeln = Itab1-vbeln AND posnr = itab1-posnr BINARY SEARCH. 时间复杂度为O(logn)阶 推荐
  READ TABLE itab2 WITH KEY  vbeln = Itab1-vbeln AND posnr = itab1-posnr. 时间复杂度为 O(n)阶. 不推荐
  二、降低数据库负载(减少IO操作) 1、避免使用SELECT … ENDSELECT语句.   SELECT ENDSELECT语句其实是一个循环体, 为了减少循环次数, 建议使用一次性TABLE赋值赋值.
  SELECT ebeln AS ekknebeln INTO TABLE it_ebeln   FROM  ekko  WHERE  ebeln = p_ebeln . 推荐
    SELECT ebeln INTO it_ebeln-ekkebeln  FROM  ekko   WHERE ebeln = p_ebeln .         APPEND it_ebeln .   ENDSELECT. 不推荐
  2、避免使用SELECT *. SAP优化   3、使用FOR ALL ENTRIES IN 语句联接数据表和内表. SAP优化 4、使用FOR ALL ENTRIES IN 语句联接数据表和内表. 使用的时机: a. 簇表是禁止JOIN的表类型, 当需要联接簇表查询数据时; b. JOIN超过3个表会出现性能问题, 当使用JOIN联接的表超过3个时.
  SELECT … INTO TABLE itab_ekko FROM ekko. SELECT … INTO TABLE itab_ekpo FROM ekpo  FOR ALL ENTERIS IN itab_ekko      WHERE ebeln = itab_ekko-ebeln……   LOOP AT itab_ekko.     READ itab_ekpo WITH KEY ebeln = itab_ekko.     ……     APPEND itab.   ENDLOOP. 推荐
  SELECT … INTO itab FROM EKKO     JOIN EKPO ON EKKO~EBELN = EKPO~EBELN     JOIN EKKN ON ……    JOIN MARA ON ……     …… 不推荐
  5、Loop 里面避免 select.
  Append lines of itab to itab1.   Sort itab1 by matnr.   DELETE ADJACENT DUPLICATES FROM itab1 COMPARING matnr.   Select matnr maktx into table lt_makt from makt For all entries in itab1  where matnr = itab1-matnr.   Sort lt_makt by matnr. Loop at itab. Read table lt_makt with key matnr = itab1-matnr BINARY SEARCH.   Itab-maktx = lt_makt-maktx.   Endloop. 推荐
  Loop at itab.   select single maktx into itab-maktx from makt where matnr = itab-matnr. Endloop.   不推荐
  三、内存使用的优化   1、使用SELECT … PACKAGE SIZE n 分段查询数据,减低数据库缓存负担. SELECT …… INTO TABLE itab PACKAGE SIZE 100 FROM VABK …… 该语句实现每次打开DB会话时, 往应用服务器上传输100条记录, 然后关闭会话, 刷新缓存。 用于在数据库缓存资源紧缺的情况使用。   2.Loop 里面避免套用 loop.
  Data tabix type sy-tabix Sort itab1 by matnr.   Loop at itab.    Read table itab1 with key matnr = itab-matnr BINARY SEARCH.   if sy-subrc = 0.    tabix = sy-tabix.      loop at itab1 from tabix.      if itab1-matnr <> itab-matnr.        exit       endif.       ……     endloop.   endif. endloop. 推荐
  Loop at itab .   Loop at itab1 where matnr = itab-matnr.   ……   Endloop. Endloop. 不推荐
总结: 1.Loop 里面避免 select. 2.Loop 里面避免套用 loop. 3.Loop 里面避免嵌套函数. 4.尽量多使用二分法来读取loop里面的内表. 5.多使用FOR ALL ENTRIES IN 限制子表的取数,切记要判断是否为空. 6.Select 查询 后面跟的range表里面的数据最好不超过1000条. 7.Select 查询最好把字段全写出来 避免写*.
上一篇:ABAP 代码中,哪些特殊字符不能用于变量命名?


下一篇:成本价自动创建功能自动函数