ABAP程序性能优化

看了几篇关于ABAP性能的文章,这篇较为靠谱。


程序效率优化的重点:
降低CPU负载
降低数据库负载(减少IO操作)
内存使用的优化

减低CPU负载:
1. 使用WHERE条件减少循环次数。
即推荐:
LOOP AT itab WHERE vbeln IN s_vbeln.
ENDLOOP.
不推荐:LOOP AT itab. IF. ENDIF. ENDLOOP.

2. 尽量避免使用MOVE-CORRESPONDING和INTO CORRESPONDING FIELDS OF。
CORRESPONDING语句在系统内部存在隐式操作:
1). 检查元素名称匹配;
2). 检查元素类型匹配;
3). 元素类型转换;

3. 使用SORTED TABLE 和 HASHED TABLE 表类型。
1). SORTED TABLE定义:
   顺序表是在计算机内存中以数组的形式保存的线性表,是指用一族地址连续的存储单元一次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的节点依次存放在计算机内存中一组地址连续的存储单元中。

DATA: it_tab TYPE SORTED TABLE OF ty_tab WITH NON-UNIQUE KEY vbeln.

2). HASHED TABLE定义:
    哈希表(也叫散列表)是根据关键字值直接进行访问的数据结构,也就是说,它通过把关键字值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。
DATA: it_tab TYPE SORTED TABLE OF ty_tab WITH UNIQUE KEY vbeln.


4. 使用BINARY SEARCH 二分查找算法。
一般线性查找的缺点就是耗时,而二分查找比线性查找更高效。
时间复杂度由O(n)阶降低到 O(log n)阶
注意:BINARY SEARCH 前必须进行索引按升序排序

5. 使用较高效的 DELETE ADJACENT DUPLICATES FROM 删除内表邻近重复记录。
语法:
(SORT <itab> f1 f2)
DELETE ADJACENT DUPLICATES FROM <itab> [COMPARING f1 f2 ...].
注意:使用前必须进行索引排序

6. 使用较高效的COLLECT 语句对记录进行聚集加总。
注意:COLLECT 语句的效率只体现在当你使用的是排序表和哈希表的时候,或者内表经过有效排序之后。否则当内表数据过多时,检索时间会很长,一般不推荐使用记录条数非常多的标准表。


降低数据库负载的技巧:
1. 避免SELECT ...ENDSELECT语句
SELECT ENDSELECT语句其实是一个循环体,为了减少循环次数,建议使用一次性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 TABLE itab1 
  FROM bkpf WHERE bukrs IN p_bukrs AND gjahr IN p_gjahr.

SELECT ... INTO TABLE itab2 FROM bseg
  FOR ALL ENTRIES IN itab1
  WHERE bukrs = itab1-bukrs
    AND belnr = itab1-belnr
    AND gjahr = itab1-gjahr.
问:二级索引在哪?BSEG有二级索引吗?

6. 使用索引提高查询效率.
SQL查询语句的WHERE 条件按照INDEX 的顺序书写。

7. 避免使用SQL的ORDER BY语句,SORT语句更高效
ORDER BY PRIMARY KEY: Sort at DB level with index
ORDER BY: Sort at DB level without index
SORT BY: Sort in ABAP, Application level.


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时,系统将依靠页面文件存放超出部分的数据。当系统内存资源十分紧缺的时候,我们可以使用OCCURS n 的初始化方法,但是这样的效率稍微慢点。


OCCURS 0 代表初始化内表的空间大小为无限,当内表存储记录条数不断增加时,内表所使用的内存空间不断扩大,直到系统无法分配为止。使用内存比使用页面交换更快一些,但是要考虑系统的资源状态。


2. 使用SELECT... PACKAGE SIZE n 分段查询数据,减低数据库缓存负担
SELECT ... INTO TABLE itab PACKAGE SIZE 100 FROM vbak...
该语句实现每次打开DB会话时,往应用服务器上传输100条记录,然后关闭会话,刷新缓存。用于在数据库缓存资源紧缺的情况下使用。


工具:
SE30:运行时间分析
评估:ABAP,数据库,R/3系统 的执行时间

ST05: 性能分析

转自:http://wenku.baidu.com/view/9284d710f18583d0496459b1.html?from=rec&pos=3&weight=4&lastweight=4&count=5

你可能感兴趣的:(ABAP程序性能优化)