Professional Documents
Culture Documents
ABAP程序开发优化
ABAP程序开发优化
第一章 概述..................................................................................................................4
第二章 技术平台..........................................................................................................5
第三章 必备技能..........................................................................................................6
第四章 ABAP 程序优化技术........................................................................................7
4.1 减少系统处理时间....................................................................................................7
4.1.1 HASH 表的使用.................................................................................................7
4.1.2 SORT 表的使用.................................................................................................8
4.1.3 STANDARD 表的使用注意事项..........................................................................9
4.1.4 尽量使用 INTO TABLE.......................................................................................9
4.1.5 FIELD SYMBEL 的使用.....................................................................................9
4.1.6 尽量避免 LOOP 中嵌套 LOOP...........................................................................9
4.2 减少数据库的响应时间.............................................................................................9
4.2.1 减少表的关联.....................................................................................................9
4.2.2 数据库索引的正确使用.....................................................................................10
4.2.3 WHERE 语句的顺序........................................................................................10
4.3 减少网络流量.......................................................................................................... 11
4.3.1 减少数据库抽取的数据量.................................................................................11
4.3.2 减少数据库取数的内容.....................................................................................11
4.3.3 减少数据库的读取次数.....................................................................................12
第五章 总结................................................................................................................13
第六章 补充................................................................................................................14
6.1.1 时间复杂度衡量(The Big-O Notation)..........................................................14
6.1.2 LOOP 嵌套 LOOP 的一种优化方法..................................................................14
第一章 概述
在 SAP 系统实施前期因为业务数据量比较小,所以程序的性能问题不突显出来,随着业务数
据量的不断增加,性能问题也就逐渐暴露了出来。
第二章 技术平台
ECC6 的开发平台
第三章 必备技能
1、ABAP 开发的基础知识
2、ABAP 三种内表的概念及使用
4、RANGE 表的概念及使用
5、COLLECT 的使用
6、表索引的使用
第四章 ABAP 程序优化技术
个人体会:ABAP 程序优化需要从以下几个方面做
四.1 减少系统处理时间
图1
例如:
定义类型:
TYPES:
* 取得基金中心描述
BEGIN OF TYP_FMFCTRT,
FIKRS TYPE FMFCTRT-FIKRS, "财务管理范围
FICTR TYPE FMFCTRT-FICTR, "基金中心
BESCHR TYPE FMFCTRT-BESCHR, "说明
END OF TYP_FMFCTRT,
* 取得承诺项目描述
BEGIN OF TYP_FMCIT,
FIKRS TYPE FMCIT-FIKRS, "财务管理范围
GJAHR TYPE FMCIT-GJAHR, "会计年度
FIPEX TYPE FMCIT-FIPEX, "承诺项目
TEXT1 TYPE FMCIT-TEXT1, "描述
END OF TYP_FMCIT.
定义内表变量:
DATA: GT_FMCIT TYPE HASHED TABLE OF TYP_FMCIT WITH UNIQUE KEY FIKRS GJ
AHR FIPEX,
GT_FMFCTRT TYPE HASHED TABLE OF TYP_FMFCTRT WITH UNIQUE KEY FIKRS FI
CTR.
取数据:
* 取得基金中心描述
SELECT FIKRS
FICTR
BESCHR
INTO TABLE GT_FMFCTRT
FROM FMFCTRT
WHERE SPRAS = '1'
AND DATBIS = '99991231'.
* 取得承诺项目描述
SELECT FIKRS
GJAHR
FIPEX
TEXT1
INTO TABLE GT_FMCIT
FROM FMCIT
WHERE SPRAS = '1'
AND GJAHR = P_GJAHR.
LOOP AT GT_FMAVCT INTO LH_FMAVCT.
AT NEW RCMMTITEM.
*-- 基金中心描述
LH_DISPLAY-FISTL = LH_FMAVCT-RFUNDSCTR.
READ TABLE GT_FMFCTRT INTO LH_FMFCTRT WITH KEY FIKRS = LH_FMAVCT-
RFIKRS
FICTR = LH_FMAVCT-
RFUNDSCTR.
IF SY-SUBRC = 0.
LH_DISPLAY-BESCHR = LH_FMFCTRT-BESCHR.
ENDIF.
*-- 承诺项目
LH_DISPLAY-FIPEX = LH_FMAVCT-RCMMTITEM.
READ TABLE GT_FMCIT INTO LH_FMCIT WITH KEY FIKRS = LH_FMAVCT-RFIKRS
GJAHR = LH_FMAVCT-RYEAR
FIPEX = LH_FMAVCT-
RCMMTITEM.
IF SY-SUBRC = 0.
LH_DISPLAY-TEXT1 = LH_FMCIT-TEXT1.
ENDIF.
ENDAT.
AT END OF RCMMTITEM.
APPEND LH_DISPLAY TO GT_DISPLAY.
ENDAT.
ENDLOOP.
第一种方案:
优化前:没有使用二分法读数据,此时以下语句的运行时间为 O(n*n)
优化后:采用二分法读取数据,此时以下语句的运行时间小于 O(n*n)
第二种优化方案:
优化前:此段程序的运行时间为:O(n*n)
优化后:此段程序的运行时间,如下图,远小于优化前的时间
第三种优化方案:
优化前:优化前:此段程序的运行时间为:O(n*n)
优化后:此段程序的运行时间,如下图,远小于优化前的时间
四.1.2.4 For All Entries 的使用
所以我们通过语句强制修改每次所取条数的个数,从而减少相关语句访问数据库的次数,因
为一般不建议直接改动系统 DB 的参数,该参数值一般是 5,是 SAP 推荐的最佳值,如果修改的
过大,会影响系统的性能,所以我们可以用语句 DB HINTS 在程序运行时短暂的修改此值,来达
到此目的,具体的语法如下:
SELECT * FROM likp INTO TABLE itab FOR ALL ENTRIES IN itab2
WHERE vbeln = itab2-vbeln
%_HINTS ORACLE '&max_blocking_factor 20& &max_in_blocking_factor 20&'.
图2
常用的 DB HINTS 语句还有加控制语句%_HINTS ORACLE 'INDEX(table_nameindex_name)'来
控制索引,具体语法如下:
SELECT * FROM spfli
%_HINTS ORACLE 'INDEX("SPFLI" "SPFLI~001")'.
COLLECT gt_collect.
IF lv_chk_date >= r_budat-low.
gt_collect-flag = 'B4'.
APPEND gt_collect TO gt_collect.
ELSE.
gt_collect-flag = 'B5'.
APPEND gt_collect TO gt_collect.
ENDIF.
ENDLOOP.
四.2 减少数据库的响应时间
四.2.1 减少表的关联
可以对多个表进行单独取数,以后的处理中对表进行读操作。
四.2.2 数据库索引的正确使用
四.2.2.1 索引的原理
当访问 DB 的时候,先根据索引,在 DB 中定义出一块大致的搜索区域(如下图 1 红色部分),
然后再从这块搜索区域中用 SQL 语句的 Where 条件去排除数据,最终得到我们需要的数据(如下
图 3 蓝色部分)。如果我们 INDEX 使用的不好,则会导致定义的搜索区域过大,这样程序访问
DB 的效率就会很低。
图3
图4
四.2.2.2 如何查找、查看表所要使用的索引
由于不同的表存在不同的索引,并且好多表都不存在唯一的索引,那我们如何去查找或者跟
踪当前表所使用的索引,或者如何去查找一个表有哪些索引,从而去优化相应的程序。
图5
四.2.2.3 如何使用索引
我们在使用索引时,必须严格按照索引的字段顺序来做为从此表取数条件的顺序,这样才能
充分利用索引的优势,如果我们没有按照索引的字段顺序做取数条件或者只取了索引中的部分字
段,这样就会达不到索引的效果,并且反而会增加取数时间。
图7
在此语句中,取数条件只取了索引的部分字段(AWKEY),并且不是从索引的第一个字段就
作为取数条件,所以此条语句在程序中的执行效率比较低。
图8
我们还可以通过在语句中直接制定表索引,通过以下语句:
SELECT * FROM spfli
%_HINTS ORACLE 'INDEX("SPFLI" "SPFLI~001")'
四.2.2.4 如何使用 SAP 的标准索引
四.2.2.4.1 关于 SD 模块
四.2.2.4.2 关于 MM/WM 模块
在 MM/WM 模 块 中 , 我 们 对 于 标 准 表 MSEG\LTAP\EBAN\RSEG 的 取 数 , 可 以 按 照 以 下
NOTE 中的取数方式,这样可以充分利用每个标准表的索引,从而提高程序的性能。
四.2.2.4.3 关于 PP/PM 模块
注:对于同一个字段有多个值时,在可以的情况下使用 IN。
例如:
SELECT DOMNAME "定义域名
DOMVALUE_L "域值: 单值/上限
DDTEXT "固定值的短文本
INTO TABLE GT_DD07T
FROM DD07T
WHERE DDLANGUAGE = '1'
AND DOMNAME IN ('GESCH', "性别
'ZJYXL', "就业学历
'ZZGXL', "最终学历
'PCN_PSTAT', "政党状况
'Z00HRHKXZ', "户口性质
'Z00HRFZJRB', "复转军人标示
'Z00HRZGXLBZ', "是否最高学历标识
'Z00HRJYXLBZ', "是否就业学历标识
'ZZYMC1', "专业名称
'ZXW1', "学位
'ZZGXL', "学历标示 -最高学历
'ZJYXL', "学历标示 -就业学历
'Z00HRJSZGJ', "专业技术资格等级
'Z00HRXDFS', "职务配置方式
'Z00HRXDBS', "党委负责人标示
'Z00HRJNZGD', "资格等级
'Z00HRBZRYJ', "获奖级别
'Z00HRBZRYL', "获奖类别
'Z00HRCFLX', "处分处罚类型
'ZZWLX', "培养类型
'ZHBCC', "后背层次
'ZPYXS', "培养形式
'ZPYJG'). "培养结果
这样 SAP 在编译时会进行优化。
四.3 减少网络流量
四.3.1 减少数据库抽取的数据量
尽量细化条件,只取所需数据
* 设备级会计凭证数据
L_ROWNUMB = 0.
LH_ANLN1-SIGN = 'I'.
LH_ANLN1-OPTION = 'EQ'.
LOOP AT GT_ZICHAN INTO LH_ZICHAN.
L_ROWNUMB = L_ROWNUMB + 1.
LH_ANLN1-LOW = LH_ZICHAN-ANLN1.
APPEND LH_ANLN1 TO LR_ANLN1.
IF L_ROWNUMB = 5000.
PERFORM FRM_RETRIEVE_FIDATA_BY_ANLN1 TABLES LR_ANLN1.
L_ROWNUMB = 0.
REFRESH: LR_ANLN1.
ENDIF.
AT LAST.
IF L_ROWNUMB > 0.
PERFORM FRM_RETRIEVE_FIDATA_BY_ANLN1 TABLES LR_ANLN1.
ENDIF.
ENDAT.
ENDLOOP.
四.3.2 减少数据库取数的内容
四.3.3 减少数据库的读取次数
五.2 如何使用调优工具
此文档只针对 ST12 这个调优工具的使用做一个简要介绍:
由于 ST12 是一个最新的调优工具,必须在符合以下标准的硬件基础上使用。
c
五.2.3 Define trace settings:
Automated collection
五.2.6 Trace Analysis
TRACE 的分析主要从以下四个方面去分析:
Response times
Memory allocation
Transferred data
RFCs
第六章 总结
对于 ABAP 程序的优化其最终目标是减少程序的运行时间,至于采用哪种手段有效,得具体情况
具体分析.