程序效率优化的重点: 降低CPU负载 降低数据库负载(减少IO操作) 内存使用的优化
减低CPU负载: 1. 使用WHERE条件减少循环次数。 即推荐: LOOP AT itab WHERE vbeln INs_vbeln. ENDLOOP. 不推荐:LOOP AT itab. IF. ENDIF.ENDLOOP.
2. 尽量避免使用MOVE-CORRESPONDING和INTOCORRESPONDING FIELDS OF。 CORRESPONDING语句在系统内部存在隐式操作: 1). 检查元素名称匹配; 2). 检查元素类型匹配; 3). 元素类型转换;
3. 使用SORTED TABLE 和 HASHED TABLE表类型。 1). SORTED TABLE定义:
DATA: it_tab TYPE SORTED TABLE OF ty_tabWITH NON-UNIQUE KEY vbeln.
2). HASHED TABLE定义:
4. 使用BINARY SEARCH 二分查找算法。 一般线性查找的缺点就是耗时,而二分查找比线性查找更高效。 时间复杂度由O(n)阶降低到 O(log n)阶 注意:BINARY SEARCH前必须进行索引按升序排序
5. 使用较高效的 DELETE ADJACENT DUPLICATESFROM 删除内表邻近重复记录。 语法: (SORT<itab> f1 f2) DELETE ADJACENT DUPLICATES FROM<itab> [COMPARING f1 f2...]. 注意:使用前必须进行索引排序
6. 使用较高效的COLLECT语句对记录进行聚集加总。 注意:COLLECT语句的效率只体现在当你使用的是排序表和哈希表的时候,或者内表经过有效排序之后。否则当内表数据过多时,检索时间会很长,一般不推荐使用记录条数非常多的标准表。
降低数据库负载的技巧: 1. 避免SELECT ...ENDSELECT语句 SELECTENDSELECT语句其实是一个循环体,为了减少循环次数,建议使用一次性TABLE赋值。
2. 避免使用SELECT *. 取而代之的是 SELECT field list INTO[TABLE]...
3. 使用FOR ALL ENTRIES IN语句联接数据库表和内表 SELECT FOR ALL ENTRIES IN 取代 LOOP +SELECT.
使用FOR ALL ENTRIES IN 要注意: 1). 检查driver table是否为空,为空不行 2). 删除重复条目
使用时机: 1). LOOP + SELECT; 2).簇表是禁止JOIN的表类型,当需要联接簇表查询时可以使用; 3). JOIN超过3个表会出现性能问题,当使用JOIN链接的表超过3个时。
4.通过创建视图高速缓存提高查询效率,在频繁读取的时候突显性能。 注意:视图所联接的表不能是事务表,因为事务表用于频繁写入,放在视图里反而增加系统更新视图内容的负担。
5. 使用二级索引提高查询效率. 案例:提高财务凭证段表BSEG查询效率 SELECT bukrs belnr gjahr INTO TABLEitab1
SELECT ... INTO TABLE itab2 FROMbseg
6. 使用索引提高查询效率. SQL查询语句的WHERE 条件按照INDEX的顺序书写。
7. 避免使用SQL的ORDERBY语句,SORT语句更高效 ORDER BY PRIMARY KEY: Sort at DB levelwith index ORDER BY: Sort at DB level withoutindex SORT BY: Sort in ABAP, Applicationlevel.
8. 使用SQL 聚合函数MAX, MIN, COUNT, AVG,SUM 聚合函数计算完成在DB level, 程序实现聚合函数功能就是在ABAP中。 问:7和8中为什么结果刚好相反?
9. 使用LDB(逻辑数据库)比直接查询表更高效 系统提供了很多LDB: HR模块:PNP FI模块:BRF SD模块:VAV 参考程序:DEMO_LOGICAL_DATABASE
程序内存使用的优化: 1. 使用OCCURS n 与 OCCURS 0的区别
OCCURS n代表初始化内表的空间大小为n,当内表存储记录条数超出n时,系统将依靠页面文件存放超出部分的数据。当系统内存资源十分紧缺的时候,我们可以使用OCCURSn 的初始化方法,但是这样的效率稍微慢点。
OCCURS 0代表初始化内表的空间大小为无限,当内表存储记录条数不断增加时,内表所使用的内存空间不断扩大,直到系统无法分配为止。使用内存比使用页面交换更快一些,但是要考虑系统的资源状态。
2. 使用SELECT... PACKAGE SIZE n分段查询数据,减低数据库缓存负担 SELECT ... INTO TABLE itab PACKAGE SIZE100 FROM vbak... 该语句实现每次打开DB会话时,往应用服务器上传输100条记录,然后关闭会话,刷新缓存。用于在数据库缓存资源紧缺的情况下使用。
工具: SE30:运行时间分析 评估:ABAP,数据库,R/3系统 的执行时间
ST05: 性能分析
转自:/view/9284d710f18583d0496459b1
如果觉得《ABAP程序性能优化》对你有帮助,请点赞、收藏,并留下你的观点哦!