ABAP程序性能优化

转载 2013年12月02日 08:46:18
程序效率优化的重点:
降低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定义:
   哈希表(也叫散列表)是根据关键字值直接进行访问的数据结构,也就是说,它通过把关键字值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做哈希函数,存放记录的数组叫做哈希表。
DATA: it_tab TYPE SORTED TABLE OF ty_tabWITH UNIQUE KEY vbeln.


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 
  FROM bkpf WHERE bukrsIN p_bukrs AND gjahr IN p_gjahr.

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

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: 性能分析

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

相关文章推荐

ABAP程序性能优化的一些做法(应该用那些优秀的写法)

待定

java程序性能优化 随书源码

  • 2017年06月29日 00:09
  • 83B
  • 下载

Domino 6应用程序性能优化指南

  • 2013年01月06日 18:05
  • 35KB
  • 下载

程序性能优化之二-----ulimit

如果并发数是10,那么不需要考虑性能优化; 如果并发数是100,则需要查看内存是否小于256M; 如果并发数200,则需要修改linux系统的ulimit文件描述符的默认值1024; 如果并发数...

Java程序性能优化(23条).

  • 2012年05月09日 23:42
  • 82KB
  • 下载

JAVA程序性能优化

  • 2008年12月03日 15:30
  • 26KB
  • 下载

Java程序性能优化读书笔记(一):Java性能调优概述

性能优化有风险和弊端,性能调优必须有明确的目标,不要为了调优而调优!!!盲目调优,风险远大于收益!!!...

帮你优化java程序性能.chm

  • 2007年12月04日 13:24
  • 1.08MB
  • 下载

Java程序性能优化读书笔记脑图

  • 2017年07月21日 17:13
  • 428KB
  • 下载

Java程序性能优化 读书笔记(六)设计模式:观察者模式

一、观察者模式 观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。它将观察者和被观察者的对象分离开。提高了应用程序的可维护性和重用性...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ABAP程序性能优化
举报原因:
原因补充:

(最多只允许输入30个字)