ABAP ALV报表性能优化 经验总结

优化ALV报表,最主要就是优化取数逻辑数据库查询。因为几乎在所有的程序中都会用到数据库查询,所以这篇文章的内容也不仅局限于SAP、ABAP程序,虽然ABAP有其特殊之处。

优化的时候我遵从以下几个原则:
1.把数据库连接视为一种极其珍贵的资源,大量的数据库操作会增加网络负载,增加程序的运行、等待时间,降低程序性能。因此有以下的注意事项:
(1)因此数据库操作能少则少严禁在循环中写SQL语句对数据库进行操作;
(2)应该将数据读取到内存中,对内存中的数据进行操作,如排序和运算等,而不是直接对数据库表进行;

2.多表连接查询时,连接的表的数量尽量不超过2-3张。当表的数量过多、数据量大时,会极大程度影响性能。应该先将数据读取到内表(类似于数组)中,使用FOR ALL ENTRIES IN 来和其余需要连接的表进行关联。且簇表无法连接,只能使用FOR ALL ENTRIES IN的方法。 虽然我看到有开发规范说尽可能只连接1张表,但是实际的业务需求中经常只是取其他表的1、2个字段,为了这1、2个字段单独建结构,然后用FOR ALL ENTRIES IN查询实在是太麻烦,这里把限制放宽到2-3张也算是为了方便和为了性能的折中考虑吧。

3.尽可能使用系统提供的方法,而不是自己实现。比如使用SQL的聚合函数进行统计、计算,而不是自己实现。

4.少循环。当数据量比较大时,多次循环会消耗大量的时间和性能。所以循环语句应该近可能少,尽量避免嵌套循环,尽可能将操作放在一次循环中进行。

5.使用一些高效的写法(至少我认为是高效的),在编程和优化过程中不断的参照了一些Performance Examples里的一些写法。主要是以下几点:
(1)需要修改内表中的某行的某字段值时,我选择使用FIELD-SYMBOLS(类似指针), LOOP ... ASSIGNING field-symbolsREAD TABLE itab ASSIGNING field-symbols这样的写法,而不是使用LOOP ... INTO wa READ TABLE itab INTO wa 修改完后再MODIFY TABLE itab FROM wa;
(2)声明的变量尽可能指明类型、长度
(3)对于长度较长、长度可变的字符串使用STRING类型替代C类型

当然难免有产生冲突的情况,比如:有时多次循环、嵌套循环不可避免,使用聚合函数进行统计需要额外的一次数据库查询等,这就需要具体情况具体分析,选择一种折中、合适的方法。

一些优化实例:

1.使用了动态查询条件,适用于查询字段相同,只是条件不同的情况,主要是减少了重复代码,说不上能改善性能。

2.将两次循环合并成一次循环进行

将原来的两段循环:

合并成:

3.使用SELECT……ENDSELECT-LOOP

这个类似于常规SQL中的游标,能每次对查询结果中的单条数据进行处理和操作。这个一定程度上弥补了ABAP的OPEN-SQL无法对查询字段做运算和SELECT 常量的操作:例如select a+b from tab 和 select ‘常量’,但感觉上使用SELECT……ENDSELECT-LOOP会增加数据库连接的占用时间。

我使用SELECT……ENDSELECT-LOOP筛选出COSS~WTG004和COSP~WTG004相加为零的结果,将原来一次额外的LOOP写到SELECT……ENDSELECT-LOOP中。

OPEN-SQL没法SELECT常量,所以只能查询后再手动修改,我将修改的一次额外循环也合并到SELECT……ENDSELECT-LOOP。

4.使用子查询,这在ABAP性能实例中也提到过,当需要判断是否存在时使用EXISTS加子查询,而不要在SELECT……ENDSELECT-LOOP再次查询是否存在,这样相当于循环中执行SQL。

5.使用聚合函数,而不是自己实现统计功能,尤其是需要进行分组统计时。

6.在需要获取内表长度的时候,用ABAP关键字DESCRIBE TABLE itab LINES length,而不是自己循环内表进行统计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeBlocks 导航栏/输出栏/菜单栏消失

参考地址:CodeBlocks 导航栏/输出栏/菜单栏消失_codeblocks工具栏没了-CSDN博客

Vivo手机怎么录屏?分享2种录屏方法

“新换的Vivo手机还挺好用的,但是今天看到一个视频想录下来保存,但找不到录屏功能啊,想问问大家Vivo手机的录屏功能怎么打开啊?还有Vivo手机能不能录制出高质量的视频呢?” 随着智能手机的普及,录屏功能已…

Redis 高并发缓存架构实战与性能优化

前置知识 1、缓存击穿、缓存失效的基本概念 2、什么样的 数据 需要加分布式锁 3、课上代码 05-一线大厂Redis高并发缓存架构实战与性能优化 对于 公司 中 简单的增删改查 做 高性能处理 , 采用递进的方式一步步优化。 普通Redis用法: 新增、修改、删…

Bazel构建工具介绍

Android开发我们主要用到的编译器是Java的Java编译器以及C/C++的gcc/clang编译器。对应Java层构建工具最初是Ant,后面Maven以及gradle;C/C++构建工具主要是make/cmake,做过系统开发或者chromeium,可能还用过ninjia、gclient、mm等。最近在编译Android平台的tensorflow lite…

Gobject tutorial 十一

参考:GObject – 2.0 Generic Value Container GValue结构体是一个变量容器,它包含一个类型成员和类型对应的值。其定义如下: /*** GValue:* * An opaque structure used to hold different types of values.** The data within the structure has pr…

ChatTTS源码部署

感谢阅读 默认已完成的操作准备工作下载源码安装依赖下载补丁(报错在运行) 界面展示(discord上有各种补丁,我的加了UI补丁和音色增强)提示词常用(这个每个音基本都能生效)语调类语速类情感类 默认已完成的操作 python版本>3.9 cuda版本的…

supersocket的app层源码解析

基础结构 #mermaid-svg-Q1MUtx0YWtvpRVNw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Q1MUtx0YWtvpRVNw .error-icon{fill:#552222;}#mermaid-svg-Q1MUtx0YWtvpRVNw .error-text{fill:#552222;stroke:#552222;}#…

《化工管理》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问:《化工管理》是不是核心期刊? 答:不是,是知网收录的第一批认定学术期刊。 问:《化工管理》级别? 答:国家级。主办单位:中国石油和化学工业联合会 主管单位&…

国产操作系统上配置ssh互信 _ 统信 _ 麒麟 _ 中科方德

原文链接:国产操作系统上配置ssh互信 | 统信 | 麒麟 | 中科方德 Hello,大家好啊!今天给大家带来一篇在国产桌面操作系统上配置SSH互信的文章。SSH(Secure Shell)是一种安全协议,用于在不安全的网络上安全地…

uniapp app分享页面到微信的功能方法

最近开发uniapp app项目时,有分享页面的功能需求,因此,给大家分享一下,在uniapp环境里,是如何分享页面到微信H5页面的。 如上图所示:app主体代码就是这样了,查看相应配置就可以,同时…

Swoole v6 能否让 PHP 再次伟大?

大家好,我是码农先森。 现状 传统的 PHP-FPM 也是多进程模型的的运行方式,但每个进程只能处理完当前请求,才能接收下一个请求。而且对于 PHP 脚本来说,只是接收请求和响应请求,并不参与网络通信。对数据库资源的操作…

图的最短路径算法:原理与实现

图的最短路径算法:原理与实现 在图论中,最短路径算法用于找到图中从一个顶点到另一个顶点的最短路径。常见的最短路径算法包括Dijkstra算法、Bellman-Ford算法和Floyd-Warshall算法。以下是每个算法的详细讲解及其Java实现。 1. Dijkstra算法 原理&am…

Android (已解决)Execution failed for task ‘:app:lint‘

文章目录 一、错误原因二、解决方法 一、错误原因 这个错误信息表示在执行 Lint 检查时发现了错误,导致构建过程被中断。Lint 是一个用于检测 Android 项目中潜在问题的工具,比如性能、安全性、可用性等方面的问题。当Lint检查到严重错误时,…

RabbitMQ如何保证消息可靠

解决办法: 1、做好消息确认机制(pulisher、consumer[手动ACK]) 2、每一个发送的消息都在数据库做好记录。定期将失败的消息再次发送一遍 消息确认机制: 生产者确认模式:确认消息是否发送到broker,失败…

20240627(26.4) 财经要闻汇总

重点关注 ► 发改委:我国金融规模体系已经很大了,但融资结构还有待改善。耐心资本的培育对于促进我国创业投资高质量发展和实现高水平科技自立自强至关重要。除了充分尊重市场规律以外,政府这只“有形的手”也可以发挥重要作用,引…

【FPGA-常见问题及解决方案】

1、VIVADO的License无法加载:license文件必须在英文路径; 2、例程代码路径不能过长,也不允许有中文路径!!! 3、明明加载了license,license也正确,例程无法完成综合:这种情…

“北京到底有谁在啊”影视APP开发,解锁最简单的快乐

随着电视剧《玫瑰的故事》在腾讯视频APP热播,APP也增加了很多热度,一款丰富的影视APP,无论是热门大片、经典影视剧、还是最新综艺节目,能畅享无限精彩的影视内容! 开发影视APP,需要专业的技术服务商来解决…

1500平方米气膜羽毛球馆的造价分析—轻空间

随着全民健身热潮的兴起,气膜羽毛球馆因其良好的空气质量、恒温恒湿的环境和快捷的建设速度,受到了越来越多人的欢迎。建造一个1500平方米的气膜羽毛球馆涉及多个方面的费用,包括场地准备、设备材料、安装施工、配套设施等。轻空间将详细分析…

【设计模式】【结构型7-1】【代理模式】【动态代理】【静态代理】

文章目录 代理模式静态代理第一步 创建接口第二步 创建需要代理的对象第三步 创建代理对象 使用 动态代理jdk动态代理cjlib动态代理 代理模式 代理 是结构型 通过继承,或者实现相同的接口来进行增强和监控 经典的使用 spring aop,mybatis dao层 静态代…

数据清洗的艺术:Python中的Pandas妙用

1. 引言 凡事总须研究,才会明白。在这信息泛滥的时代,数据如同一片混沌的荒原,若不经雕琢,便难以显现其真面目。而对于程序员而言,数据清洗的过程,正是从混沌到秩序的一次次锤炼。 2. 数据清洗的必要性 …