对ABAP程序调优的学习(一)select 改 read table
写这篇文章时,我突然想到很多年前,先明拿作他的软盘,在我家电脑上,把一个他做的传染程序要给我展示,结果没有成功,因为我的系统是MS DOS6了,而他做的程序是运行在DOS5环境中的。那时候他就喜欢在重大机房里抓获各种病毒标本来研究。
得到一个标本,是深入学习的开始。现在我们有一个报表程序,运行起来比较慢一点,我们申请了远程支援,SAP原厂的顾问来帮我们诊断和调优。这样我们有了标本,也有老师来亲自指导,这是最好的学习环境了。
看看程序的逻辑:
我们其实不关心具体是什么业务数据,我们只关系程序运行的速度。
这个程序是一个最典型的报表程序,在数据库里面取数,然后用ALV列表控件显示出来。
程序一共定义了5张内表:
GT_OUT,GT_ALV
GT_OUT3,
GT_OUT4,
GT_OUT5.
1、GT_ALV它最后直接提供给ALV列表控件显示。
2、GT_OUT是最外层的字段最多的内表,它的部分关键字段数据是一开始通过SQL一次获取到的。
3、然后程序取了a017表中的数据,放到GT_OUT3内表中。
4、从采购订单的表头和行项目表,取了计划行相关的数据,放到GT_OUT4内表中。
5、取配额表的数据,放到GT_OUT5内表中。
6、开始循环最外层的内表【GT_OUT】,GT_OUT的每一行:
到GT_OUT4中循环抓取对应的数据一行
到GT_OUT5中循环抓取对应的数据一行
到GT_OUT3中循环抓取对应的数据多行,这里还循环这个多行,按这个子循环去添加到最后的GT_ALV中。
我们用ST12跟踪这个程序的结果分析如下:
程序总执行了238秒,在循环GT_OUT3中耗时201秒,GT_OUT4耗时17秒,GT_OUT5耗时15秒,读KONP表用了38秒(这步代码是在循环GT_OUT3中的)。
SAP顾问服务很好,直接给出了修改代码:
任务1: 把原来定义GT_OUT3为标准表,改成定义为排序表。
任务2: 把原来定义GT_OUT4为标准表,改成定义为排序表。
任务3: 把原来定义GT_OUT5为标准表,改成定义为排序表。
任务4: 把原来GT_OUT3里面,每一次读KONP表改成小循环外面一次读取出来。
我们在测试系统中按4个点修改完程序,测试运行。
结果,程序并没有像我们希望的那样,反而运行超时了。
再用ST12跟踪,发现程序主要在任务4的改动上增加了更多的数据操作。暂时,我们放弃了任务4的修正。只修改了任务1~3,我们再来运行一下程序:
报表运行时间只用了34秒就完成,而原来的时间是238秒,优化后的速度提高了7倍。
主要耗时的LOOP AT GT_OUT3 从原来的201秒缩短到31秒。
这个程序的优化,我们学到了使用ST12来跟踪分析和排序表。
原来我只会用se30,确实像顾问说的,ST12看到的信息更多。
关于排序表,金圣俊的书中131页也有详细描述,排序表主要用在只读的内表,可以提高数倍的性能。
--------2021.12.09-------
上次还遗留了这个地方没有优化:
这个2层循环中的select single语句,今天看BC490有点感悟,继续优化了一下,程序只跑了5秒就出来了。
这个优化思路是:如果表小,干脆全部一次放入内表,HANA数据库虽然是内存数据库,但是从应用服务器到内存数据库的网络需要时间,如果次数很多,加起来还是很可观的。
还记得我们的SAP HANA性能测试吗?测试的结果,读最快的场景中是我的联想S30工作站,它比正式服务器还快,因为我只有一台机器,把应用和数据库都安装在了一台机器上,结果没有网络通讯的环境,读应用非常的快。
--------2021.12.10-------
和何喜讨论,何喜说还可以把GT_KONP表的数据再缩小,这确实是一个方法。
对ABAP程序调优的学习(一)select 改 read table相关推荐
- 对ABAP程序调优的学习(三)并行并发读取
该篇文章详细介绍用SAP ABAP 并发读取功能解决数据读取慢的问题.也许你也感兴趣该文章的前序文章:整车订单下达接口的最佳实践. 博主有一个场景,在APO模块中读取生产订单和相关的配置.BOM数据, ...
- 【Spark深入学习 -14】Spark应用经验与程序调优
----本节内容------- 1.遗留问题解答 2.Spark调优初体验 2.1 利用WebUI分析程序瓶颈 2.2 设置合适的资源 2.3 调整任务的并发度 2.4 修改存储格式 3.Spark调 ...
- Java启动参数与内存调优一些学习笔记
转载自 Java启动参数与内存调优一些学习笔记 .参数的含义 -Xms128m JVM初始分配的堆内存 -Xmx512m JVM最大允许分配的堆内存,按需分配 -XX:PermSize=64M JV ...
- 深度神经网络之Keras(三)——正则化、超参数调优和学习方向
深度神经网络之Keras(三)--正则化.超参数调优和学习方向 本文将继续探索Keras框架下的深度神经网络知识,主要介绍了利用Keras构建的深度神经网络正则化及超参数调优问题. 目录 深度神经网络 ...
- java性能调优实战学习笔记
这是极客时间专栏<java性能调优实战>的部分学习笔记,个人感觉这个专栏内容不深,适合初学者,我只看了编程性能调优和数据库性能调优两块,其他的暂时不打算看了,后续有时间再看吧 有任何问题可 ...
- oracle11g程序调优纪实
一个控制台程序,主要业务就是读取某目录的zip压缩包文件,解压后遍历每个xml文件,解析文件内容然后存储到oracle11g(互联网主机)上. 程序第一版: 1)实现方式:使用动软的代码生成器里常用的 ...
- 怎么对 Java 程序调优?不看别后悔!
Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢.接口超时,服务器负载高.并发数低,数据库频繁死锁等. 尤其是在"糙快猛"的互联网开发模式大行其道的今天,随着 ...
- 怎么对Java程序调优?不看别后悔!
前言: 作为一个程序员,性能优化是常有的事情,不管是桌面应用还是web应用,不管是前端还是后端,不管是单点应用还是分布式系统.尤其是在"糙快猛"的互联网开发模式大行其道的今天,随着 ...
- JVM 调优(学习篇)
概述 公司的江南白衣写了一篇关键业务系统的JVM参数推荐(2016热冬版)的文章,大牛的文章总是需要细细品读.这篇文章介绍大量的JVM调优参数,内容也比较多,本文只是列出我自己能理解的一些参数,暂时理 ...
最新文章
- 解读丨从自动驾驶到学习机器学习:科技发展的15大趋势
- ES使用org.elasticsearch.client.transport.NoNodeAvailableException: No node available 错误解决方法
- find vba 模糊_VBA积木代码方案:实现多重查找、模糊查找、清除值
- java split函数报错
- 36岁,程序员,为公司工作8年,昨天HR说公司不准备续约
- centos7 网卡配置vlan_centos 7 下多网卡绑定+ vlan 网卡配置
- 聊一聊晋升带来的思考
- python 数据库模块_MySQl 数据库 之 python模块 pymysql 简单介绍
- Linux 信息的各种查询(系统发行版本、内核版本、系统位数)
- python与office结合可以干什么-震惊!当Python遇到Excel后,将开启你的认知虫洞
- 20180330试试水
- hadoop 新API与旧API对比
- 取模运算和求余运算的区别
- 外贸供应链ERP怎么选?全流程综合管理解析
- ubuntu开机出现initramfs该如何解决
- 计算机控制面板的字体在哪里,电脑的字体怎么设置
- ARP中使用driftnet工具捕获图片
- androir 遍历所有文件夹,查询视频文件
- Tencent Linux操作系统宣布开源
- CH55x使用Arduino编程记录(三)Could not get xxx consecutive bytes in internal RAM for area OSEG