二维码

[性能] SAP数据库及ABAP代码性能优化方案

Twilight发表于 2014-05-16 11:57Twilight 最后回复于 2014-05-16 11:57 [复制链接] 5087 0

一、目的
  • 了解优化思路
  • 建立代码规范

二、背景
  • 通常在系统应用实施的初期,数据库中的数据量都不会很大,因此相关的功能开发也都不会太关注性能问题,只要程序运行正常、能够获得正确结果就可以。但是在系统运行了一段时间以后,随着系统中数据量增加,性能问题就会成为影响用户使用的重要因素。最终用户会经常抱怨系统运行缓慢,报表要跑几十分钟,影响工作等等
  • 我们平时开发的多数都是报表程序,而面对SAP 庞大的数据量,报表运行缓慢通常是最大的问题。其实SAP 系统在开发过程中经常会根据需要把数据写到若干相关的 数据表中,使用某个表无法获得满意的性能时或许可以通过其他表查 询到相同的结果,而效率则会有质的飞跃。因此熟悉了解业务操作与 数据记录的关系是解决ABAP 性能问题的另一个重要途径,这需要我们更多的学习SAP 业务逻辑。

三、概览
  • R/3 客户/服务器优化
  • ABAP 性能优化(  性能分析员角色的人必须熟悉 ABAP 和R/3 Basis  )

四、R/3 客户/服务器优化
  • 数据库工作进程
  • 数据库缓存
  • 物理I/O
  • 数据库SQL

五、ABAP代码优化
1、ABAP优化工具
1)、R3工作量监视器
要显示每个事务步骤的统计量,使用事务码STAD 或 者从R/3 初始屏幕选择菜单路径:工具-管理-监视 器-性能-工作量-统计记录
stad.jpg
数据库细节视图显示一个单独事务步骤的执行的事务 步骤的信息。
可以帮助决定使用哪个进一步的分析工具(SQL 性能追 踪、ABAP 运行时分析),检查响应时间、分配器待时间、CPU时间和数据库时间(做为数据库请求时间来指示)
R3工作量监视器.jpg
2)、SQL跟踪
要访问SQL 性能追踪,使用事务码ST05
st05.png
使用SQL 性能追踪的目标是找出具有高优化潜力的 SQL 语句

每次数据库操作的数据库响应时间、时间戳、传送的 数据记录数量、数据库返回码、SQL 语句文本以及附 加的管理信息等数据都被写入追踪文件追踪清单同样不考虑数据库系统。需要超过100 毫秒的数据库操作被标记为红色
SQL 性能追踪1.png
双击表格结构可以显示有关表格统计信息和表格所有 索引信息的对话框。双击索引显示它的统计信息
SQL 性能追踪2.png
SQL 性能追踪3.png
使用按钮“ABAP 显示” 或者从菜单选择“追踪- ABAP 显示”。就会显示光标在追踪列表当前位置的 SQL 语句的ABAP 代码。
SQL 性能追踪4.png
在追踪清单中,选择“转到-摘要” 显示清单形式的摘要。这个清单显示了SQL 操作,影响的数据记录数量以及所需的处理时间。
SQL 性能追踪5.png
从追踪清单中,选择“转到-相同选择” 来查看一个追 踪里相同值的SQL语句的概览。
SQL 性能追踪6.png

3)、ABAP 运行时分析——事物码SE30
屏幕提供一个比较 ABAP 进程、数据库和R/3 三者运行时间分配的柱状图。在柱状图下面是转换的信息和被加载的程序总数
ABAP 运行时分析1.png
所有被调用的程序部分,按照总时间排序。它为每个程序部分或指令列出一行。 该行显示程序部分或指令的名字、总时间、净时间和 这个程序部分或指令被调用的次数
ABAP 运行时分析2.png

2、ABAP代码优化
1)、ABAP WHERE 条件
  1. SELECT bukrs belnr gjahr FROM bkpf INTO TABLE g_itab_bkpf
  2. WHERE belnr = '0000283912'.
复制代码
对于上面的例子,WHERE 条件没有为字段BUKRS (主索引的第二个字段)指定值。因此,在被检查的选择索引块中,有关组件的索引搜索串就完全是不可选择的
  1. SELECT bukrs belnr gjahr FROM bkpf INTO TABLE g_itab_bkpf
  2. WHERE bukrs = '1000' AND belnr = '0000283912'.
复制代码
对于例子,索引中所有字段都无间隔的指定,并且用 WHERE 条件“=”。因此只需要检查很少的索引块

2)、ABAP 判断操作符
  1. SELECT vbeln erdat kunnr FROM vbak INTO TABLE g_itab_vbak
  2. WHERE kunnr IN g_kunnr
  3. AND NOT auart IN ('TA', 'KL', 'SO', 'ZBC').
复制代码
对于上面的语句,只有字段MANDT 和KUNNR 可以 用于索引搜索。
  1. SELECT vbeln erdat kunnr FROM vbak INTO TABLE g_itab_vbak
  2. WHERE kunnr IN g_kunnr
  3. AND auart IN ('BV', 'WV', 'ZWK1', 'SM', space).
复制代码
对于,字段MANDT、KUNNR 和AUART 都可以用 于索引搜索。

3)、ABAP 判断操作符
  1. SELECT * FROM vbap INTO TABLE g_itab_vbap
  2. WHERE vbeln BETWEEN '00003001' AND '00003005'.
复制代码
带有BETWEEN 的WHERE 条件不能通过索引来搜索
应替换为
  1. SELECT * FROM vbap INTO TABLE g_itab_vbap
  2. WHERE vbeln IN ('00003001', '00003002', '00003003‘
  3. '00003004', '00003005')
复制代码
注意创建索引
避免对SAP Basis 表的二级索引,例如NAST
只有当使用索引能够返回小于5% 的表记录时,使用 索引才有意义
索引一定不能包含其他索引
尽量少的创建索引(大约每个表5个索引)

4)、优化例子
  1. DATA C TYPE C.
  2. IF     C = 'A'.   WRITE '1'.
  3. ELSEIF C = 'B'.   WRITE '2'.
  4. ELSEIF C = 'C'.   WRITE '3'.
  5. ELSEIF C = 'D'.   WRITE '4'.
  6. ELSEIF C = 'E'.   WRITE '5'.
  7. ELSEIF C = 'F'.   WRITE '6'.
  8. ELSEIF C = 'G'.   WRITE '7'.
  9. ELSEIF C = 'H'.   WRITE '8'.
  10. ENDIF.
复制代码
  1. DATA C TYPE C.
  2. CASE C.
  3.    WHEN 'A'. WRITE '1'.
  4.    WHEN 'B'. WRITE '2'.
  5.    WHEN 'C'. WRITE '3'.
  6.    WHEN 'D'. WRITE '4'.
  7.    WHEN 'E'. WRITE '5'.
  8.    WHEN 'F'. WRITE '6'.
  9.    WHEN 'G'. WRITE '7'.
  10.    WHEN 'H'. WRITE '8'.
  11. ENDCASE.
复制代码

  1. DATA: MAX_MSGNR type t100-msgnr.
  2. MAX_MSGNR = '000'.
  3. SELECT * FROM T100 INTO T100_WA
  4.   WHERE SPRSL = 'D' AND
  5.         ARBGB = '00'.
  6.   CHECK: T100_WA-MSGNR > MAX_MSGNR.
  7.   MAX_MSGNR = T100_WA-MSGNR.
  8. ENDSELECT.
复制代码
  1. DATA: MAX_MSGNR type t100-msgnr.
  2. SELECT MAX( MSGNR ) FROM T100 INTO max_msgnr
  3.   WHERE SPRSL = 'D' AND
  4.         ARBGB = '00'.
复制代码

  1. READ TABLE ITAB INTO WA
  2.                 WITH KEY K = 'X'.
复制代码
  1. READ TABLE ITAB INTO WA
  2.                 WITH KEY K = 'X'
  3.                 BINARY SEARCH.
复制代码

  1. SELECT  DISTINCT vttp~vbeln vttk~tknum
  2.       INTO CORRESPONDING FIELDS OF TABLE i_vttk
  3.     FROM vttk INNER JOIN vttp
  4.         ON vttk~tknum = vttp~tknum
  5.       FOR ALL entries IN i_vbeln
  6. WHERE vttk~tplst IN s_tplst
  7.       AND vttk~shtyp IN s_shtyp
  8.       AND vttp~vbeln = i_vbeln-vbeln.
复制代码
  1. SORT i_vttk BY tknum vbeln.
  2.   DELETE ADJACENT DUPLICATES FROM i_vttk COMPARING  tknum vbeln .
复制代码

  1. LOOP AT TAB INTO TAB_WA.
  2.   INSERT INTO CUSTOMERS VALUES TAB_WA.
  3. ENDLOOP.
复制代码
  1. LOOP AT ITAB1 INTO WA.
  2.   APPEND WA TO ITAB2.
  3. ENDLOOP.
复制代码

  1. INSERT CUSTOMERS FROM TABLE TAB.
复制代码
  1. APPEND LINES OF ITAB1 TO ITAB2.
复制代码

  1. SORT ITAB.
复制代码
  1. SORT ITAB BY K.
复制代码

  1. call function 'FUNCTION1'.
复制代码
  1. call method CL_PERFORMANCE_TEST=>M1.
复制代码


  1. DATA:
  2.    N1(15) TYPE N VALUE '123456789012345',
  3.    N2(15) TYPE N VALUE '543210987654321',
  4.    N3(15) TYPE N.
  5.    N3 = N1 + N2.
复制代码
  1. DATA:
  2.    P1     TYPE P VALUE '123456789012345',
  3.    P2     TYPE P VALUE '543210987654321',
  4.    P3     TYPE P.
  5.    P3 = P1 + P2.
复制代码

  1. Loop at int_cntry.
  2. Select single * from zfligh into int_fligh
  3. where cntry = int_cntry-cntry.
  4. Append int_fligh.
  5. Endloop.
复制代码
  1. Select * from zfligh appending table int_fligh
  2. For all entries in int_cntry
  3. Where cntry = int_cntry-cntry.
复制代码

六、优化资料
R3客户/服务器优化相关  ADM315
ABAP优化相关  BC490
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表