当前位置: 首页 > article >正文

ABAP基础知识 复杂程序的性能优化

前言

当程序相对复杂时, 前期开发可能更注重于功能的实现. 等功能实现后, 发现大量数据执行时程序耗时太长. 需要开启程序的优化过程

本文主要介绍程序分析及优化的过程,方法

程序性能分析

事务代码ST12 ,选择current mode ,输入程序或事务代码, 点击执行按钮,正常执行程序. 可以在comment中输入一些备注. 以便说明本次跟踪的缘由.

4efce0ff793332794f439a3fa6cbc2f7.png

正常执行完程序,退出程序返回到ST12界面, 下方会显示本次执行的日志内容

3de8b253cc56849047b32ac3eda480a8.png

点击相关的按钮可以看到程序执行过程的所有跟踪信息

db3f626c00340159f18f50ceb236adb1.png

ABAP trace中可以看到整体执行的ABAP语句耗时及数据库访问耗时. 下面清单中可以看到每个调用模块的耗时及总耗时占比(cross time in %) 净耗时占比( Net time in % )

一般情况下,通过净耗时占比可以快速定位到耗时较大的模块及语句

cfe6b182fcebf6aa847d161d00d3cca3.png

一个程序的优化

优化前 总用时283秒,大部分开销在表的读取及表的更新上,可以从ABAP 跟踪中看出耗时的SQL语句

fc2672c7a602d99bceb3de97c2c3b8bc.png

b695b6c3cd8dd7bba17e0f45a16b47c9.png

01

优化表的读取

关于表的读取优化, 用程序的主动缓存(配置表全表缓存,业务表单记录缓存)取代SELECT SINGLE 语句(即使使用了表的技术设置添加了表或视图的缓存). 因为程序的调用层级比较深, 使用了静态类的全局变量的方法缓存哈希表.

详见链接

无峰,公众号:ABAP 技巧与实战ABAP基础知识 数据读取的缓存

fbdff81704f566ffc9b458dd0a9941f3.png

优化效果

总耗时减少了一半以上,部分select 语句耗时大幅减少

0affbde355d45e910f538af48b7676ac.png

050a76a4f4794733551e0e3d336158d5.png

02

把特定业务表改成全表缓存

特定表从单记录主动缓存调整为全表主动缓存

有一定的优化效果,调整的表的访问耗时明显减少.

这种方式会增加程序的内存开销,需要综合分析是否启用.

此时发现程序的最大开销在于数据库的更新

264603517e217de4579a2b2b90d9449b.png

fed8ce0b4e3e1d2d9cbeaa1ec5d6f484.png

b90888342659064e793386c9b50f470c.png

03

调整更新模式

分析更新逻辑,调整更新模式,按行更新调整为按单更新(不是所有的程序都能做这种调整, 当前这个程序因为业务逻辑原因, 支持按单更新)

耗时占用减少到原来的1/5左右

另外,数据库更新最好在循环后整体提交(或者达到指定数据量提交,避免每行/每单提交)

c1ca4bddffa15e2b345e22a4a0455a4f.png

9a4a610acc200e5b2c29b1670baee05b.png

总结

通过SAP的程序执行分析工具ST12 可以查看程序执行过程中的每个模块/语句的耗时占比 . (其它事务代码如SAT,处理方式和跟踪结果于ST12类似. )

找出占比最高的模块或语句. 找到合适的方法优化.

本文介绍了两个主要优化思路

  • 程序主动缓存表取代系统缓存或数据库访问

  • 按单更新取代明细更新(逻辑允许的情况下).

其它优化思路可以参考之前的部分文章

链接

无峰,公众号:ABAP 技巧与实战SAP小技巧 双LOOP循环的性能优化

链接

Dylan,公众号:ABAP 技巧与实战SAP-ABAP性能优化之构建嵌套结构的哈希表

http://www.lryc.cn/news/2417368.html

相关文章:

  • 1.23聚类算法(kmeans(初始随机选k,迭代收敛),DBSCAN(dij选点),MEANSHIFT(质心收敛),AGENS(最小生成树)),蚁群算法(参数理解、过程理解、伪代码、代码)
  • 【设计模式】备忘录模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
  • linux内核register_chrdev_region()系列函数
  • eclipse中如何使用svn
  • 结构体sockaddr、sockaddr_in、sockaddr_in6之间的区别和联系
  • I3D模型_2017_CVPR
  • Framework3.5 最终文件下载及离线安装
  • OpenGL 入门(一)— 创建窗口
  • Matlab roundn()函数使用样例
  • iOS - 融云RTC功能梳理
  • 信息安全-网络安全测评技术与标准
  • 学习心得——析构函数
  • AutoIt3使用
  • Android 使用ExpandableListView实现三级列表
  • Java GUI三种常见的布局方式.FlowLayout,BorderLayout,GridLayout.教程
  • Linux驱动之模块参数param和符合导出export用法
  • 【MSTP+VRRP实验】华三MSTP+VRRP配置,华三MSTP+VRRP实验
  • portlet的开发介绍
  • Win7系统提示找不到LogonUI.exe文件的解决办法
  • Java解析XML文件--实现读取/导入、写入/导出功能
  • 资源网站mark
  • 手機 Cell ID 與定位
  • 社招网站推荐
  • 【入门】Java使用htmlutil进行数据爬取 {一篇文章让你了解爬虫技术栈}
  • OpenWrt开发必备软件模块——进程管理服务procd
  • 信号状态关_HINET工业智能网关三种联网模式操作说明
  • wpf中EventHandler的使用
  • 2023-05-31【05】Windows 10安装Oracle10g客户端
  • U盘文件系统FAT32、exFAT、NTFS之间有什么区别?
  • 解决 Linux 桌面问题思路分享