欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用运行时间分析工具SE30优化ABAP程序

程序员文章站 2022-03-10 21:07:51
...

ABAP运行时间分析工具使用SE30方法

使用ABAP运行时间分析工具的优化思想是二八原则,即优化目标放在最消耗效率的地方进行优化,进而获得最大的优化效果
示例:ZCN41N优化
优化办法:
1、项目定义不允许输入星号。
2、先权限检查
3、物料描述:放后面,当取出物料需求后,在进行抽取物料描述。
4、通过获取到的权限值:项目负责人(vener),进行过滤取项目,及后续WBS
5、通过获取到的权限值:MRP控制者(vener),进行过滤取网络
优化结果:
生产机优化前:15.50分
优化后:10.19分

(一) 操作

事物代码SE30 输入事物代码/程序/模块,点击Execute,进入程序界面,运行完成后退出,回到SE30界面,点击Evaluate显示分析报表,双击行项目可以看具体的明细。
使用运行时间分析工具SE30优化ABAP程序
使用运行时间分析工具SE30优化ABAP程序
使用运行时间分析工具SE30优化ABAP程序

(二) 分析方法

  1. 一看概述 ABAP/数据库运行时间比例
    不同时期数据量不一样,运行时间不一样,所以单从ABAP/数据库各自运行的时间,对比优化后与优化前的差别是不可行的。所以,需要从它们的处理时间占比的角度来分析优化的结果。比如下面示例中,优化前ABAP占比17.9%,数据库占比82%,表明数据库亟需优化,优化数据库更能有效提升运行效率。所以示例中着重优化了数据库处理效率。结果如下:
    优化前
    数据处理时间占比82%
    使用运行时间分析工具SE30优化ABAP程序
    优化后
    数据处理时间占比降低至63%
    使用运行时间分析工具SE30优化ABAP程序
    表明优化后数据库处理时间占比下降,总效率得到了提升
  2. 二看清单 行项目耗时
    在优化前,可以分析占比靠前的函数、数据库语句,优先优化靠前的项目,能够更有效的提升运行效率。 优化完成后,检查原先耗时较长的项是否还占比较大,可以得知优化是否有效。下面示例中优化前RESB处理时间排名靠前,经过优化后第一页已不再有RESB处理语句,表明优化有效果。
    优化前
    发现读取RESB处理时耗较长
    使用运行时间分析工具SE30优化ABAP程序
    优化后
    RESB表读取耗时已不在前列,表明优化有效
    使用运行时间分析工具SE30优化ABAP程序
    优化后RESB数据库耗时已不在排名靠前

(三) 相关事物码

SE30 ST12 ST05 DB02

(四) 附:SQL语句优化方法(引用部分)

  1. 用where语句
    不推荐
 Select * from zflight. Check : zflight-airln = ‘LF’ and
    zflight-fligh = ‘BW222’. Endselect. 

推荐

  Select * from zflight where
   airln = ‘LF’ and fligh = ‘BW222’. Endselect.
  1. 使用聚合函数
    不推荐
Maxnu = 0.
Select * from zflight where airln = ‘LF’ and cntry =IN.
Check zflight-fligh > maxnu.
Maxnu = zflight-fligh.
Endselect.

推荐

Select max( fligh ) from zflight into maxnu where airln = ‘LF’ and cntry =IN.
  1. 使用视图代替基本表查询
    不推荐
Select * from zcntry where cntry likeIN%.
Select single * from zflight where cntry = zcntry-cntry and airln = ‘LF’.
Endselect.

推荐

Select * from zcnfl where cntry likeIN%and airln = ‘LF’.
Endselect.
  1. 使用INTO table 代替select endselect
    不推荐
Refresh: int_fligh.
Select * from zflight into int_fligh.
Append int_fligh. Clear int_fligh.
Endselect.

推荐

Refresh: int_fligh.
Select * from zflight into table int_fligh.
  1. 使用批量修改内表代替逐行修改
    不推荐
Loop at int_fligh.
If int_fligh-flag is initial.
Int_fligh-flag = ‘X’.
Endif.
Modify int_fligh.
Endloop.

推荐

Int_fligh-flag = ‘X’.
Modify int_fligh transporting flag where flag is initial.
  1. 使用二分法查询,提高查询内表数据速度
    不推荐
Read table int_fligh with key airln = ‘LF’.

推荐

Read table int_fligh with key airln = ‘LF’ binary search.
  1. 两个内表添加使用批量增加代替逐行
    不推荐
Loop at int_fligh1.
Append int_fligh1 to int_fligh2.
Endloop.

推荐

Append lines of int_fligh1 to int_fligh2.
  1. 使用FOR ALL Entries
    不推荐
Loop at int_cntry. 
Select single * from zfligh into int_fligh where cntry = int_cntry-cntry. 
Append int_fligh.
Endloop.

推荐

Select * from zfligh appending table int_fligh
For all entries in int_cntry 
Where cntry = int_cntry-cntry.
  1. 使用sort by 代替order by
  2. 避免使用SELECT DISTINCT语句
    使用的 ABAP SORT + DELETE ADJACENT DUPLICATES 代替.
  3. 两个实例
DATA: BEGIN OF it_mara OCCURS 0,
matnr LIKE mara-matnr,
maktx LIKE makt-maktx,
END OF it_mara.

第一种写法:

Select matnr
INTO it_mara
FROM mara.
APPEND it_mara.
ENDSelect. 

第二种写法(high performace):

Select matnr
INTO TABLE it_mara
FROM mara.
DATA: BEGIN OF it_mara OCCURS 0,
matnr LIKE mara-matnr,
maktx LIKE makt-maktx,
END OF it_mara.
DATA: BEGIN OF it_makt OCCURS 0,
matnr LIKE mara-matnr,
maktx LIKE makt-maktx,
END OF it_makt.

第一种写法:

LOOP AT it_mara.
Select SINGLE maktx
INTO it_mara-maktx
FROM makt
Where matnr = it_mara-matnr AND
spras = sy-langu.
MODIFY it_mara TRANSPORTING maktx.
ENDLOOP. 

第二种写法(high performace)

Select matnr maktx
INTO TABLE it_makt
FROM makt
FOR ALL ENTRIES IN it_mara
Where matnr = it_mara-matnr and
spras = sy-langu.

1 数据——>工作区,工作区——>内表,
2 数据——>内表
很明显少了一个过程 效率自然高了 如果数据量越大,效果是可想而知的

  1. 不要使用<>运算符