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 ... BINARY SEARCH.
4,虽然说操作内存比磁盘操作要高效,但是如果对内存的使用不加以控制,可能有些时候不得不对硬盘的交换空间操作, 这样就增加了对磁盘的I/O读写操作.正如下面所说: 当你定义内表的时候可以也会出现这样的问题, 比如你定义一个内表使用的是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 WHERE BUKRS = '1000' AND BELNR = '0100000007' 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 ALL ENTRIES IN 以及 READ TABLE WITH KEY BINARY SEARCH.例如我们要提高读取BSEG表的性能,首先我们会根据GJAHR主键从BKPF表取出部分数据到内表itab,然后使用FOR ALL ENTRIES IN itab WHERE BSEG~BELNR = itab~BELNR 这样的的方法取得符合itab里所有条件的BSEG数据.注意使用FOR ALL ENTRIES要先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 ROWS. SELECT SINGLE AIRPFROM AIRPTO INTO (AP1, AP2)
FROM SPFLI
WHERE CARRID = SBOOK_WA-CARRID
AND CONNID = SBOOK_WA-CONNID. SELECT SINGLE NAME INTO NAME1
FROM SAIRPORT
WHERE ID = AP1. SELECT SINGLE NAME INTO NAME2
FROM SAIRPORT
WHERE ID = AP2. ENDSELECT.
代码2:
SELECT * FROM SBOOK INTO SBOOK_WA UP TO ROWS. SUPPLY CARRID = SBOOK_WA-CARRID CONNID = SBOOK_WA-CONNID TO CONTEXT TRAV1. DEMAND AIRPFROM = AP1 AIRPTO = AP2 NAME_FROM = NAME1 NAME_TO = NAME2 FROM CONTEXT TRAV1. ENDSELECT.
最后是注意内存的使用,以下是内存优化方面的例子:
1, 虽然ABAP拥有垃圾处理的机制, 但是这个是在程序运行完成后实现的. 所以我们尽量把无用的变量,内表,对象都释放掉;
2, 尽量减少无用的静态定义的变量,内表和对象, 因为静态定义的对象会在编译开始就占有内存空间;
3, 尽量减少网络的传输负载, 比如在设计RFC远程调用传回的内表数据要尽量精简, 数据量越大,对CPU和内存需求越多;
4, 内存使用紧张的情况下, 使用FREE语句, 以及SQL语句的PACKAGE SIZE n 选项.
SELECT vbeln erdat FROM vbak INTO TABLE li_vbak PACKAGE SIZE .
ABAP程序的效率(转)的更多相关文章
- ABAP程序执行效率和优化 ABAP Performance Examples
一. SQL Interface1. Select ... Where vs. Select + Check用Select … Where语句效率比Select ...
- 你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧
最近Jerry在忙一个项目,技术栈换成了nodejs平台,语言换成了JavaScript,因为赶项目进度,一直没时间更新公众号.感谢大家的支持,关注人数还是慢慢地增长到了3000. 今天我们来聊聊一个 ...
- ABAP程序运行锁定
转自http://www.cnblogs.com/aBaoRong/archive/2012/06/15/2550458.html ABAP 程序运行锁 1. create a Table ZRUNN ...
- (转)对《30个提高Web程序执行效率的好经验》的理解
阅读了博客园发布的IT文章<30个提高Web程序执行效率的好经验>,这30条准则对我们web开发是非常有用的,不过大家可能对其中的一些准则是知其然而不知其所以然. 下面是我对这些准则的理解 ...
- [SAP ABAP开发技术总结]ABAP程序之间数据共享与传递
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 解读30个提高Web程序执行效率的好经验
其实微博是个好东西,关注一些技术博主之后,你不用再逛好多论坛了,因为一些很好的文章微博会告诉你,最近看到酷勤网推荐的一篇文章<30个提高Web程序执行效率的好经验>,文章写得不错,提到一些 ...
- 通过ABAP程序创建透明表
最近在解决用户账号问题的时候,需要通过ABAP程序创建透明表,查询了相关资料,总结如下. 通过ABAP程序创建透明表,主要利用了4个函数: DDIF_TABL_ACTIVATE: 激活透明表 GOX_ ...
- SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错
SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错 BP,试图创建一个新的vendor code, 角色是ZGM001, Grouping是G001, ...
- 在SAP云平台ABAP编程环境上编写第一段ABAP程序
距2017年秋季的SAP TechEd大会上一位大佬Björn Goerke,SAP's Chief Technology Officer宣布了SAP Cloud Platform即将支持ABAP至今 ...
随机推荐
- JavaScript模块化开发库之SeaJS
SeaJS是一个很好的前端模块化开发库,源码不到1500行,压缩后才4k,质量极高.
- iOS - 沙盒机制
iOS应用程序只能在为该程序创建的文件系统中读取文件,不可以去其他地方访问,此区域被称为沙盒.所有的非代码文件都要保存在此,例如图像,图标,声音,属性列表(plist文件),文本文件等.沙盒机制作为一 ...
- Case When PK PIVOT
SELECT *FROM ScoreInfogo Name Course Score---------- ---------- -----------Lucy Chinese 74Jim Math 8 ...
- python多线程 批量下补丁
一个一个下载 要2个多小时.就直接起了个线程池.效果明显.import urllib2 from urlparse import urlparse uri = 'http://******/patch ...
- python中的单下划线和双下划线意义和作用
Python中并没有真正意义上的“私有”,类的属性的的可见性取决于属性的名字(这里的属性包括了函数).例如,以单下划线开头的属性(例如_spam),应被当成API中非公有的部分(但是注意,它们仍然可以 ...
- bzoj 1455: 罗马游戏 左偏树+并查集
1455: 罗马游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 668 Solved: 247[Submit][Status] Descriptio ...
- 【Tools】Pro Git 一二章读书笔记
记得知乎以前有个问题说:如果用一天的时间学习一门技能,选什么好?里面有个说学会Git是个很不错选择,今天就抽时间感受下Git的魅力吧. Pro Git (Scott Chacon) 读书笔记: ...
- js 模块化
http://kb.cnblogs.com/page/132461/ http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth. ...
- EasyUI datagrid数据表格的函数getData返回来的是什么
EasyUI datagrid数据表格的函数getData返回来的是什么? 他返回来的是这么一个对象: Object { rows=[10], total=15} 其中rows就是每一行的数据,是这些 ...
- 《鸟哥的Linux私房菜》读书笔记一
1.CPU为一个具有特定功能的芯片,里面含有微指令集,一个CPU又可以分为两个主要的单元:算术逻辑单元和控制单元.CPU读取的数据都是从内存读取来的,内存内的数据是从输入单元传输来的.CPU处理完也要 ...