ABAP程序运行效率
abap程序执行效率

以下是我在网上看到的一篇关于ABAP程序优化的文章,觉得非常不错,对今后的开发很有帮助,拿出来跟大家分享一下。
原文:程序的效率是每个程序员都应该重视的,无论是采用的哪一种语言进行开发.在我做过的一个项目中,一个几万条数据的运行,在没有考虑效率,对代码没有进行优化前的运行时间是7个小时,当对代码进行一系列的优化修改后,运行的时间就只剩一个小时,由此可见,代码的优化是多么的重要。
那么,我们在写ABAP程序时,怎样的语句才能提高到效率呢,下面是我总结到的几点:1、抽取数据时,避免使用SELECT *, 尽量使用SELECT A B INTO TABLE ITAB这样的语句。
2、不要使用SELECT...ENDSELECT语句。
3、尽量避免在LOOP中访问数据库。
可以在之前先把数据取到内表,在LOOP中用READ TABLE WITH KEY ... BINARY SEARCH.进行读取对应的数据。
4、用SORT代替ORDER BY。
5、避免使用嵌套的循环。
6、尽量不要使用JOIN进行多表连接。
把一个表的数据先取到内表,然后使用FOR ALL ENTRIES语句再进行抽取。
7、使用二分查找法。
READ TABLE的之前使用SORT TABLE BY对内表进行排序, 然后使用READ TABLE WITH KEY ...BINARY SEARCH.8、避免使用SELECT DISTINCT语句。
在抽取数据到内表后用DELETE ADJACENT DUPLICATES语句来消除重复行。
9、尽量加多WHERE语句进行条件抽取。
以上,说的还不全,会进行不断更新。
另外,可以通过TCODE:ST05 SE30 进行程序和SQL语句性能和效率的分析。
SAPABAP性能优化

SAPABAP性能优化SAPABAP(高级商务应用编程语言)是一种面向SAP应用程序开发的编程语言。
在开发SAPABAP应用程序时,性能优化是非常重要的,可以提高应用程序的响应速度和效率。
以下是一些优化SAPABAP性能的技术和实践。
1.数据库访问优化:在数据库访问方面,以下几种方法可以提高性能:-尽量避免对数据库频繁的读写操作,尽量减少数据库访问的次数。
-使用WHERE语句来限制查询结果的数量,尽量避免返回大量数据。
-使用索引来加速数据库查询操作。
对于频繁访问的字段,可以创建相应的索引。
-避免在循环中进行数据库查询操作,可以将多次查询合并为一次查询,提高效率。
2.代码优化:在编写ABAP代码时,以下几种方法可以提高性能:-避免使用SELECT*语句,尽量只选择需要的字段。
-避免在循环中进行复杂的计算操作,可以将计算提取到循环之外,减少计算次数。
-避免频繁使用长字段,例如TEXT字段,可以将其存储在辅助表中,减少数据库访问次数。
-使用内表来处理数据,避免频繁的数据库访问。
3.内存优化:在使用内存方面,以下几种方法可以提高性能:-尽量减少内存的使用,避免无用的变量和数据结构占用过多内存。
-对于大量数据的处理,可以使用ITAB或HASHEDTABLE来提高效率,尽量避免使用SORTEDTABLE。
-注意内存泄漏问题,及时释放不再使用的内存空间。
4.并发处理优化:在处理并发操作时,以下几种方法可以提高性能:-使用合适的锁策略,避免死锁和长时间的等待。
-尽量避免对同一个资源进行频繁的读写操作,可以考虑其他方法来减少并发冲突。
-使用事务控制来保证数据的一致性和完整性。
-如果可能,可以将并发操作分解成多个较小的操作,减少并发冲突的可能性。
5.缓存优化:在使用缓存方面,以下几种方法可以提高性能:- 使用合适的缓存技术,例如SAP的共享内存(Shared Memory)和缓冲区(Buffers)。
-对于频繁使用的数据,可以将其缓存在共享内存中,提高访问速度。
abap程序优化方法

如何提高ABAP程序效率一、既然要提高效率,我们一定要先知道如何来直观的对比效率。
1、查看程序执行效率Tcode :SE30输入事务代码、程序名称、功能模块名称,点Execute,执行程序,执行完程序以后,点击左下角Analyze,可以查看程序执行效率,根据图形对程序的执行进行分析,点左上角,可以查看详细的每条语句的执行效率,可以针对语句进行分析,如果语句执行时间过长,可以对语句或方法进行优化。
二、一些优化方法:1.最主要的是尽量减少I/O操作,然后是内存占用,再就是CPU的负载。
CPU的负载可以通过优化程序来改善,在程序中尽量使用诸如SUM(SQL语句)或者COLLECT(ABAP语句)。
2.尽可能多地使用表的索引作为Where分句的条件选项,尽可能让程序只读取一定范围内的记录(比如说,你只准备操作一个月之内的业务数据,那么对于这一个月的业务就应该有一定的范围取值,如1000~2000)。
3.尽量使用Select A B C INTO TABLE ITAB这样的语句。
这个操作会将所有符合条件的数据一次性地读进内表,这比在Select A B C INTO ITAB... ENDSELECT的循环中添加数据到内表要快。
尽可能使用Select SINGLE语句,而不使用up to 1 rows。
4.order by 命令是在数据库服务器上执行的,而sort 语句是在应用服务器上执行的。
所以使用sort by排序而不使用order by 。
5.可以使用视图来代表基本表的查询。
6.可以使用一些聚合函数、GROUP BY …HA VING,来进行计算和分组统计,也可以来改善查询的效率。
例如:不推荐Maxnu = 0.Select * from zflight where airln = ‘LF’ and cntry = ‘IN’.Check zflight-fligh > maxnu.Maxnu = zflight-fligh.Endselect.推荐Select max( fligh ) from zflight into maxnu where airln = ‘LF’ and cntry = ‘IN’. 8.使用where语句不推荐Loop …If …Endif.Endloop.推荐Loop …where…Endloop.9.使用批量修改内表代替逐行修改不推荐Loop at int_fligh.If int_fligh-flag is initial.Int_fligh-flag = ‘X’.Endif.Modify int_fligh.Endloop.推荐Int_fligh-flag = ‘X’.Modify int_fligh transporting flag where flag is initial..10.使用二分法查询,提高查询内表数据速度使用之前一定要排序。
ABAP程序执行效率优化的研究

ABAP 程序执行效率优化的研究蒋文文(大庆石化公司信息技术中心大庆163000)摘要:ABAP(高级商业应用程序)语言是SAP 系统自带的一种开发语言,ABAP 程序设计在ERP(企业资源计划系统)实施过程起着重要的作用。
ABAP 程序的优劣直接影响企业对ERP 的应用。
研究了数据库效能优化和内表的优化。
其中内表在ABAP 程序中承担着重要的角色,重点研究了内表的类型、访问方式和内表连接,提出了基于内表的ABAP 程序优化方案。
对于内表连接,提出了一种改进的连接算法,提高了程序的时间复杂度,使程序的执行效率得到了成倍的提升,并在项目实施过程中获得了稳定的运行效果。
关键字:ABAP 语言;内表;SAP 系统;企业资源计划0 引言随着企业信息化建设的不断发展,SAP系统成为全球最大的ERP系统之一,但是由于企业间具有各自不同的需求。
标准的SAP系统往往无法满足特定行业的客户需求,尤其是一些企业特殊的流程和报表。
所以,需要开发一些程序来补充额外的需求,从而满足客户化定制的需求。
SAP系统本身自带了一种开发语言ABAP。
ABAP全称是Advanced Business Application Programming(高级商业应用程序),它是由SAP公司开发的一种编程语言,用于应用程序的交互式开发,属于第4 代编程语言[1]。
ABPA不仅是一个开发工具,而且是非常成熟和稳定的综合开发平台。
它是完全集成在R/3 系统中的,有一套完整的client/server开发环境,包括设计和开发程序、屏幕、菜单、功能模块等所需的一切工具,以及程序调试、性能和在线分析、测试所需的实用程序。
客户化定制开发主要分四大类[2]:(1)增强与修改:对R/3 系统标准的ABAP 程序、菜单、屏幕、数据表等进行调整,以满足特定的业务需求。
(2)报表:根据用户提供的查询条件,对数据进行查询和运算后在屏幕上展示结果集。
(3)表单:各类票据或凭证的输出。
abap reduce使用方法

abap reduce使用方法(最新版)目录1.ABAP REDUCE 方法的概念与作用2.ABAP REDUCE 方法的语法与参数3.ABAP REDUCE 方法的应用实例正文【1.ABAP REDUCE 方法的概念与作用】ABAP REDUCE 方法是 SAP ABAP 编程语言中一种用于简化和优化程序设计的方法。
它可以帮助程序员在编写代码时减少冗余操作,提高程序执行效率。
REDUCE 方法主要用于对两个或多个数值进行算术运算,如加减乘除等,它可以将多个操作合并为一个步骤,从而减少计算次数,提高程序运行速度。
【2.ABAP REDUCE 方法的语法与参数】ABAP REDUCE 方法的语法如下:```REDUCE(val1, val2,...)```其中,val1、val2 等为参与运算的数值。
REDUCE 方法可以接受两个或多个参数,这些参数可以是数值型变量、常量或者表达式。
在使用REDUCE 方法时,各参数之间用逗号分隔。
REDUCE 方法的返回值是计算结果。
需要注意的是,REDUCE 方法不会对参与运算的数值进行类型转换,因此在使用时,各参数的类型应保持一致。
【3.ABAP REDUCE 方法的应用实例】下面通过一个实例来说明 ABAP REDUCE 方法的应用:假设有一个程序需要对 10 个数值进行求和计算,如果使用传统的循环语句,需要进行 10 次加法运算。
而通过使用 ABAP REDUCE 方法,可以将这 10 次加法运算合并为一次,从而大大提高程序运行效率。
具体代码如下:```DATA: lv_sum TYPE i,lv_num TYPE i VALUE 10.lv_sum = REDUCE(lv_num) / 10.```在上述代码中,我们使用 REDUCE 方法对 10 个数值求和,并将结果赋值给 lv_sum 变量。
这样,程序只需执行一次计算,即可得到最终结果,提高了程序运行效率。
abap效率

涉及大量的数据处理,
应该首先和系统管理员协商来决定这个程序最多能使用多少内存,以计算这个程序需要使用多
少资源。
然后你就可以决定是把数据写入内存还是交换空间。
3.尽可能多地使用表的键值作为WHERE分句的条件选项。尽可能让程序只读取一定范围内的记录
(比如说,你只准备操作一个月之内的业务数据,那么对于这一个月的业务就应该有一定的范围
杭州娃哈哈集团有限公司
地 址:杭州市秋涛北路128-1号
通信地址:杭州市秋涛北路128-1号娃哈哈集团有限公司计算机中心
邮 编:310020
电 话:(86)-571-86033064
电子邮件:mjz@
MSN: courser001@
*********************************************
如果使用到的记录条数超出NUM_RECS参数的限制,数据将被存放在硬盘上的交换空间(不是内
存)。
7.尽量使用SELECT A B C INTO TABLE ITAB这样的语句。这个操作会将所有符合条件的数据一次
性地读进内表,
这比在SELECT A B C INTO ITAB... ENDSELECT的循环中添加数据到内表要快。请注意,这里声
ABAP/4的程序会需要花费大量的时间执行,而且会使其它进程被迫暂停以等待当前程序运行结
束。
这里提供一些建议以提高你的程序运行速度和系统荷载。
1.最主要的是尽量减少I/O操作,然后是内存占用,在再就是CPU的负载。类似对硬盘的读写的I/O
操作是最耗费时间的。
如果对内存的操作不加以控制,可能有些时候不得不对硬盘的交换空间操作,这样就增加了对
ABAP程序性能优化的一些做法

ABAP程序性能优化的一些做法ABAP程序性能优化的一些做法ABAP程序基本上都需要从数据库里面抓数,所以性能很重要,同时有一些基本的,和优秀的写法是我们必须要掌握的,不然就会造成程序性能很差。
下面给予总结(这里包括有很基本的,也包括有比较少用到的),顺便推荐一个好的SAP标准文档 ABAP_PERFORMANCE_DOS_AND_DONTS :我觉得重要的是,1.尽量少的取数据到abap执行,多用inner join 把数据取出来。
一、基本的几条需要避免的规则(具体的一些怎么替换,可以看三和五):1、不使用select....endselect,估计月球人都知道这个事实了。
2、基本不使用select * ,跟多人喜欢直接用这个,因为方便,但是在数据量比较大的时候,应该使用select 字段,这样可以避免抓取无用数据。
3、LOOP 里面不用sort ,在loop外面排序完再进入LOOP。
4、尽量避免LOOP 里面嵌套select,这样多次访问数据库也会造成性能问题,但是有些时候避免不了也难免。
改为外面select,LOOP 里面read table。
5、大数据的read table,使用二分法 BINARY SEARCH,用之前要按关键字排序。
6、尽量避免LOOP里面嵌套LOOP,特别是当两个内表数据量都很大的时候,如果实在要嵌套LOOP可以参考三和五里面的解决办法。
7、尽量避免LOOP里面不用delete,append等语句。
改成批量处理。
二、index和buffer的合理使用:1、index的使用,在使用现有的index的时候注意,where条件里面的字段的顺序要跟index一致,而且可以可以适当的去匹配index,创建一些空的字段或者是index 后面再加字段,或者是使用index抓出数据后,再去做其它条件的处理。
2、index里面最好只有'=' AND 或者是…IN?。
有其它逻辑条件,会影响index的使用。
SAP中ABAP程序优化

SAP中ABAP程序优化摘要随着我们公司在业务上的飞速发展,公司信息中心对ERP技术支持的力度上也在不断加强,因为ERP数据库中的数据随着业务的发展相应的飞速增长,不可避免的,对在SAP中ABAP前、后台程序执行时间的要求越来越成为我们关注的焦点。
由于受客观原因的限制,使得所开发的ABAP程序不是最优的,所以要通过优化,缩短程序运行时间。
一般来说,程序的优化涉及程序的执行效率、安全性、可移植性等诸多方面,本文仅讨论ABAP报表执行效率方面的优化。
关键词SAP;ABAP;程序优化随着我们公司在业务上的飞速发展,公司信息中心对ERP技术支持的力度上也在不断加强,因为ERP数据库中的数据随着业务的发展相应的飞速增长,不可避免的,对在SAP中ABAP前、后台程序执行时间的要求越来越成为我们关注的焦点。
由于受客观原因的限制,使得所开发的ABAP程序不是最优的,所以要通过优化,缩短程序运行时间。
一般来说,程序的优化涉及程序的执行效率、安全性、可移植性等诸多方面,本文仅讨论ABAP报表执行效率方面的优化。
1 程序的效能分析一般来说,当一个程序执行时间超过100S时,该程序就使人不可忍受,就应该分析该程序的效能,判断是否可以优化设计。
首先找出有问题的程序,通过T-CODE:SE30或SM37进行查找,分析是后台执行的哪些程序慢。
例:ZFI002N资产负债表(新会计准则)。
根据图形对程序的执行进行分析,点左上角,可以查看详细的每条语句的执行效率,可以针对语句进行分析,如果语句执行时间过长,可以对语句或方法进行优化。
其次分析程序效能,选择事务码SE30,进行程序和SQL语句性能和效率的分析,找出程序慢的部分。
执行完程序可以区分3个阶段的执行时间:ABAP、数据库、R/3系统,这3个部份对效能的优先级为数据库Database->系统System->ABAP要依序排除程序这些部份的问题。
再次进行Database效能分析。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ABAP程序运行效率(转)程序的效率是每个程序员都应该重视的,无论您是采用哪一种语言进行开发. 程序有时候越短,并不一定越快,有时候程序很多代码,但不一定会很慢. 性能是一把双刃剑, 获得时间效率的同时, 牺牲的是空间的开销. 这里提供一些建议以提高你的程序运行速度和减低系统荷载。
首先是尽量减少I/O操作,类似对硬盘的读写的I/O操作是最耗费时间的, 比如读写数据库。
以下是减少I/O操作的例子:1, 减少数据库DB的读写操作, 当使用VIEW视图的时候, 当被视图join的table有数据更新操作的时候, 同时系统也会更新到这个view里面, 使得它们之间的数据一样, 所以使用视图会对这些日常操作带来效率问题. 如果视图join的表多数是日常事物需要更新的事物数据表(如EKET), 就要避免使用视图.2, 避免使用SELECT *, 尽量使用SELECT A B C INTO TABLE ITAB这样的语句。
这个操作会将所有符合条件的数据一次性地读进内表,这比在SELECT A B C INTO WA... APPEND... ENDSELECT的循环中添加数据到内表要快。
不用频繁的读DB.3, 避免频繁使用SELECT SINGLE语句, 特别是在LOOP和SELECT...ENDSELECT里面用, 应该把要读取的数据用SELECT FOR ALL ENTRIES IN 一次全部取得, 然后用READ TABLE WITH KEY ... BINARYSEARCH.虽然说操作内存比磁盘操作要高效,但是如果对内存的使用不加以控制,可能有些时候不得不对硬盘的交换空间操作, 这样就增加了对磁盘的I/O读写操作.正如下面所说:4, 当你定义内表的时候可以也会出现这样的问题, 比如你定义一个内表使用的是OCCURS 100,而不是OCCURS 0, 会导致内表长度大于100的时候,就会占用系统页面缓存。
5, Field-groups对于多层次的排序和显示是非常有用的。
它是将数据写入系统的页面文件,而不是内存(内表一般是使用内存的)。
基于这个原因,field-groups比较适合于处理大量数据的列表(一般超过50000条记录)。
如果涉及大量的数据处理,应该首先和系统管理员协商来决定这个程序最多能使用多少内存,以计算这个程序需要使用多少资源。
然后你就可以决定是把数据写入内存还是交换空间。
6, 用SORT代替ORDER BY, ORDER BY从句是执行在数据库服务器上, 而SORT是ABAP语句执行在应用服务器上的. 数据库服务器通常会形成性能瓶颈问题, 所以最好是吧数据导入内表做SORT.7, 避免使用SELECT DISTINCT语句, 因为当你用来判断唯一的字段为非索引字段时, 效率是十分的低, 所以请导入内表SORT后, 使用DELETE ADJACENT DUPLICATES 来去重复.其次就是要减轻CPU的负载, 可以通过优化程序来改善,比如在程序中语句和算法, 以下是减低CPU负载的优化例子:1, 使用宏代替频繁函数调用. ABAP没有内联函数这个说法, 所以我们如果需要频繁调用函数时, 函数调用有栈内存创建和释放的开销. 在ABAP中可以用宏代码提高执行效率,宏代码不是函数但使用起来像函数,编译器用复制宏代码的方式取代函数调用,省去了参数压栈、从而提高速度。
注意使用宏有缺点:(1)容易出错, 宏不能pass-by-value按值传递,用于代替实现函数功能时要十分注意!(2)不可调试; (3)无法操作类的私有数据成员.2, 避免使用过得的LOOP 和SELECT .... END SELECT. 避免使用嵌套的LOOP 和SELECT .... END SELECT.3, 尽可能多地使用表的KEY FIELD作为Where分句的条件选项。
比如SELECT * FROM BSEG WHEREBUKRS = '1000' AND BELNR = '010*******' AND GJAHR ='2006' AND BUZEI = '003'. 这里的四个字段BUKRS,BELNR,GJAHR,BUZEI 都是BSEG表的KEY字段.4, 如果某些数据需要频繁的从不同表提取, 使用视图VIEW实现读取缓存可以提高效率. 当视图连接的是读取次数较多, 但写入不频繁的表时(比如物料主数据表MARA), 可以使用视图, 这样比在程序里面简单用join要快,理论上join语句每次读取的速度都是一样的, 而视图是从读二次开始就快了, 而且cache使得网络负载减低.5, 使用SQL语句里面的JOIN时候, 应该避免JOIN的表不要超过3个, 否则严重影响效率. 如果真的要JOIN表3个以上的话, 正确的方法不是用视图VIEW, 而是使用SELECT ... INTO TABLE ... FOR ALLENTRIES IN 以及READ TABLE WITH KEY BINARY SEARCH.例如我们要提高读取BSEG表的性能,首先我们会根据GJAHR主键从BKPF表取出部分数据到内表itab,然后使用FOR ALL ENTRIES IN itab WHEREBSEG~BELNR = itab~BELNR 这样的的方法取得符合itab里所有条件的BSEG数据.注意使用FOR ALLENTRIES要先CHECK作为条件的内表itab是否为空,还有作为WHERE的条件在这个内表里面是否会有空值存在,否则无效.6, 注意使用CORRESPONDING FIELDS OF 和 MOVE-CORRESPONDING 时候会进行字段比较, 带来CPU的开销大.7, 避免过得而频繁的数据类型转换,比如N转换为C,但是从N转换成STRING却是很快的,因为操作STRING比CHAR类型少了比较长度的时间.8, 使用二级索引提高DDIC的读写效率, 可以根据你的需要在SE11里面创建INDEX, 并让你程序里的SQL查询语句里WHERE条件的顺序与你的索引顺序一致.9, 二分查找比线性查找要高效,READ TABLE的之前使用SORT TABLE BY XXX 某个表关键字段进行排序, 然后使用READ TABLE WITH KEY XXX = 'XXX' BINARY SEARCH. 这个就是所谓的二分查找法的应用.10, 避免使用SQL语句动态查询条件,动态表名和动态字段名, 必要时候用宏或者子程序模块代替. 11, 对于同一功能的函数和方法, 调用METHOD比调用FUNCTION要快.12, SORTED TABLE可以使用二分查找法取得节点, 其时间复杂度是O(log N),但是插入节点会慢,因为要移动很多节点. 而HASHED TABLE则是基于哈希算法的,其高效主要体现在把数据的存储和查找时间大大降低,几乎可以看成是常数时间O(1),而代价是消耗比较多的内存,然而在硬件技术越来越发达的今天,用空间换时间的做法在某种意义上是值得的。
但是使用哈希表必须注意键值的唯一性!如果键值会出现重复的话,不能使用哈希表,只能用排序表和标准表。
13, 使用APPEND LINES(或者INSERT LINES) OF ITAB1 TO ITAB2 比LOOP AT ITAB1 INTO WA. APPEND(INSERT) WA TO ITAB2. ENDLOOP. 要高效.14, 使用效率比较高的COLLECT, DELETE ADJACENT DUPLICATES FROM语句。
15, 使用高效的CONTEXT SQL语句.如以下代码2比代码1要快10倍以上!代码1:SELECT * FROM SBOOK INTO SBOOK_WA UP TO 10 ROWS.SELECT SINGLE AIRPFROM AIRPTO INTO (AP1, AP2)FROM SPFLIWHERE CARRID = SBOOK_WA-CARRIDAND CONNID = SBOOK_WA-CONNID.SELECT SINGLE NAME INTO NAME1 FROM SAIRPORTWHERE ID = AP1.SELECT SINGLE NAME INTO NAME2 FROM SAIRPORTWHERE ID = AP2.ENDSELECT.代码2:SELECT * FROM SBOOK INTO SBOOK_WA UP TO 10 ROWS.SUPPLY CARRID = SBOOK_WA-CARRIDCONNID = SBOOK_WA-CONNIDTO CONTEXT TRAV1.DEMAND AIRPFROM = AP1AIRPTO = AP2NAME_FROM = NAME1NAME_TO = NAME2FROM CONTEXT TRAV1.ENDSELECT.最后是注意内存的使用,以下是内存优化方面的例子:1, 虽然ABAP拥有垃圾处理的机制, 但是这个是在程序运行完成后实现的. 所以我们尽量把无用的变量,内表,对象都释放掉;2, 尽量减少无用的静态定义的变量,内表和对象, 因为静态定义的对象会在编译开始就占有内存空间;3, 尽量减少网络的传输负载, 比如在设计RFC远程调用传回的内表数据要尽量精简, 数据量越大,对CPU和内存需求越多;4, 内存使用紧张的情况下, 使用FREE语句, 以及SQL语句的PACKAGE SIZE n 选项.SELECT vbeln erdatFROM vbakINTO TABLE li_vbak PACKAGE SIZE 50.。