如何提高ABAP程序运行效率.doc

上传人:11****ws 文档编号:3040165 上传时间:2019-05-18 格式:DOC 页数:8 大小:118.50KB
下载 相关 举报
如何提高ABAP程序运行效率.doc_第1页
第1页 / 共8页
如何提高ABAP程序运行效率.doc_第2页
第2页 / 共8页
如何提高ABAP程序运行效率.doc_第3页
第3页 / 共8页
如何提高ABAP程序运行效率.doc_第4页
第4页 / 共8页
如何提高ABAP程序运行效率.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、如何提高 ABAP 程序运行效率 1 如何提高 ABAP 程序 运行效率 中国石油测井有限公司 钮 顺 摘要 : ABAP 的程序会需要花费大量的时间执行 , 而且会使其它进程被迫暂停以等待当前程序运行结束。 本文通过对 ABAP 程序编写部分技巧的介绍,以及 I/O 操作,内存占用,CPU 负载 等方面 介绍提高程序的运行效率 。 关键词 : ABAP, I/O 操作 , 内存占用 , CPU 负载 前言 信息化建设对 公司实现率先建成一流的社会主义现代化企业和具有国际竞争力的跨国公司的奋斗目标,具有十分重要的意义 ,当然企业资源的管理和合理的应用尤为重要,这样ERP 系统集信息技术与先进的

2、管 理思想于一身,成为现代企业的运行模式,反映时代对企业合理调配资源,最大化地创造社会财富的要求,成为企业在信息时代生存、发展的基石。 一个系统的成功应用主要在于它是否适合应用的环境,这样就取决于系统的开发工作,而高效完善的程序是系统的基础。 1 概念 1.1 ABAP 高级业务应用编程 (Advanced Business Application Programming)。它是 SAP 开发设计的用于对 SAP 系统进行应用分析、二次开发的主要工具,是所有 SAP 应用的基础。 ABAP 是一种支持结构化程序设计的语言,它合并 了所有通常的控制结构和模块化概念,同时,它还支持面向对象的程序设

3、计方法。 1.2 ABAP 的特性 ABAP/4 支持商业数据类型和操作。您可以用特殊日期和时间字段进行计算。 系统会自动执行必需的类型转换。 ABAP/4 包含一个叫 Open SQL 的 SQL 子集。用 Open SQL,您可以读取和访问数据库表,与所用的数据库系统无关 。 ABAP/4 允许您定义和调用子程序。也可以调用其他程序的子程序。参数能够以各种方式从子程序传递或传递到子程序。 如何提高 ABAP 程序运行效率 2 ABAP/4 包含一种特殊子程序,叫做功能模块。您可以在中 央库中创建和维护功能模块。在调用程序和子程序之间功能模块有一个明确定义的数据接口。它们能够以调用程序的独立

4、模式进行分别测试。 ABAP/4 报表程序用于分析数据库表中的数据。这种分析的结果可以显示在屏幕上或发送到打印机上。逻辑数据库支持报表程序。 ABAP/4 将对话程序组织为包含对话模块的模块池。每个动态程序 ( 由一个屏幕及其流逻辑组成的 “ 动态程序 ” ) 都基于一个 ABAP/4 对话程序。流逻辑包含对 ABAP/4 对话模块的调用。 1.3 和 ABAP 相关联的 SAP BASIS 结构 SAP R/3 系统是一个典型的 三层架构系统,包括: 表现层( Presentation Layer):这是 SAP 用户和 R/3 系统交流的接口,用户在这一层对SAP 系统进行操作。这层将用户

5、的命令或者操作传送给 R/3 系统,然后系统进行相应的处理后把数据返还给用户。 应用层( Application layer):这层包括一个或者多个应用服务器和一个消息服务器。每一个应用服务器包括一系列服务以便运行应用程序。所有的服务分置在这些应用服务器之中,其实用户需要的只是其中的一个应用服务器,多个服务器之间传递信息以决定用户到底需要的是哪个服务器的服务。 数据库层( Database layer):这里就是 SAP 系统的核心,存放了所有 SAP 系统的数据。 图 1 三层逻辑结构 如何提高 ABAP 程序运行效率 3 2 ABAP 程序优化 2.1 语法优化 2.1.1 SELECT

6、写法 一 : SELECT MATNR INTO IT_MARA FROM MARA. APPEND IT_MARA. ENDSELECT. 写法 二 : SELECT MATNR INTO TABLE IT_MARA FROM MARA. 写法一 是将 数据 先放置到 工作区 再将 工作区 的数据添加至 内表, 第二种是将 数据直接放置到内 表里,当然第二 种方法效率要高很多。 同理尽可能的使用 INTO ITABLE 语句来代替SELECT ENDSELECT。不要再循环中使用 SELECT语句,这样每次循环 都要 SELECT一下 , SELECT 本身就是循环 ,如此 循环 嵌套 循环

7、 , 时间消耗度是 N*N。 在 数据量大了之后,在 SELECT 和END SELECT 之间做处理的时间会很长, SELECT END SELECT 语句在整个过程中是保持数据库连接的 , 从而导致数据库端因为连接超时而断开 ,因此 在 处理 大数据量的报表中,不能用SELECT END SELECT 这种写法。 2.1.2 批量处理 写法 一 : LOOP AT INT_FLIGH. IF INT_FLIGH-FLAG IS INITIAL. INT_FLIGH-FLAG = X. ENDIF. MODIFY INT_FLIGH. ENDLOOP. 写法 二 : INT_FLIGH-FL

8、AG = X. MODIFY INT_FLIGH TRANSPORTING FLAG WHERE FLAG IS INITIAL. 第一种方法是使 用 LOOP 循环 内表 内 的 每一行 数据 进行判断然后处理,第二种是直接 对整个内表处理,当然第二种方法要快的多 。同理合理应用 聚合函数 ( max( ))、内表的批量添加 ( APPEND lINES) ,多项目查询 ( FOR ALL ENTRIES) ,整体赋值 ( MOVE-CORRESPONDING)都是化零为整的处理行为,对于数据量大的处理能起到很好的效果。 如何提高 ABAP 程序运行效率 4 2.1.3 其他语句 1 使用

9、WHERE 语句 , CHECK 的效率较慢。 不推荐 : SELECT * FROM ZFLIGHT. CHECK : ZFLIGHT-AIRLN = LF AND ZFLIGHT-FLIGH = BW222. ENDSELECT. 推荐 : SELECT * FROM ZFLIGHT WHERE AIRLN = LF AND FLIGH = 222. ENDSELECT. 2 使用视图代替基本表查询 。 不推荐 : SELECT * FROM ZCNTRY WHERE CNTRY LIKE IN%. SELECT SINGLE * FROM ZFLIGHT WHERE CNTRY = ZC

10、NTRY-CNTRY AND AIRLN =LF. ENDSELECT. 推荐 : SELECT * FROM ZCNFL WHERE CNTRY LIKE IN% AND AIRLN = LF. ENDSELECT. 3 使用二分法查询,提高查询内表数据速度 。 不推荐 : READ TABLE INT_FLIGH WITH KEY AIRLN = LF. 推荐 : READ TABLE INT_FLIGH WITH KEY AIRLN = LF BINARY SEARCH. 4 避免使用 SELECT DISTINCT 语句 , 使用 SORT + DELETE ADJACENT DUPL

11、ICATES 代替 。 5 真确的使用 INNER JOIN 将两个或多个 透明表 连接起来 查询。 2.2 簇表 ( BSEG) 处理 提高程序的效率就要提高对簇表的处理,下面以最典型的 BSEG 说明。 了解 BSEG 的开发人员应该知道它 于一般的透明表不同,它是一个簇表。对于一个簇表来说,除了主键项目外,其他项目都被编辑到一个长文本项目中,一起存储在表簇 RFBLG 中的 vardata 项目中,这就决定了作为簇表的 BSEG 无法再建立键值以外的索引( INDEX) ,所以一般我们对于透明表来说当主键项目不全或完全没有时,追加索引的作法对于 BSEG 表来 说就不好用了。而 BSEG

12、簇表又是 SAP 系统中 FICO 会计模块中最常被使用的数据表,所以运用好对 BSEG 表的访问技术对于 FICO 会计模块的扩展开发 至关重要。 如何提高 ABAP 程序运行效率 5 对於簇表来说,在数据库中没有与之同名的实体物理表相对应,所以虽然其可在 ABAP中使用,但还是有一些限制的 : 1. 不能使用 SELECT DISTINCT 语法 , BSEG 中的字段存储在 VARDATA 中,所以不能使用 DISTINCT 语句对单个项目去除重复。 2. 不能使用 Native SQL, 在数据库中没有与之同名的实体物理表相对应,所以不能使用 Native SQL 对 BSEG 操作。

13、 3. 不能使用 Order by 语法 , BSEG 中的字段存储在 VARDATA 中,所以不能使用 Order by语句对单个项目排序。 4. 不能再追加创建索引 , BSEG 中的字段存储在 VARDATA 中,所以不能再追加创建索引。 除此之外,对 BSEG 的访问要使用主键项目,如果没有主键项目虽然语法调试能够通过,但是程序执行起来,耗时长,效率低,而且随着业务量的增加执行时间问题会越发严重,甚至导致程序不能正常执行结束。 当主键 值不足时, 可以使用如下 二次索引透明表 : BSAD:应收明细(已清帐)客户 BSID:应收明 细(未清帐)客户 BSAS:总帐明细(已清帐)总账 B

14、SIS:总帐明细(未清帐)总账 BSAK:应付明细(已清帐)供应商 BSIK:应付明细(未清帐)供应商 使 BKPF 是财务凭证抬头, BSEG 是财务凭证行项目。在财务凭证记账的时候,数据被插入 BKPF 和 BSEG 的同 时插入以上六张表中的一个未清表。 下面举例说明一下效率的改进,在财务模块三栏账页打印程序( ZD600FIR022)中,下面为耗时较多的部分源代码: SELECT BUKRS “公司代码 BELNR “会计凭证编号 GJAHR “会计年度 BUZEI “会计凭证中的行项目号 HKONT “总分类帐帐目 DMBTR “按本位币计的金额 SHKZG “借方 /贷方标识 PR

15、CTR “利润中心 XNEGP “标识 : 反记帐 FROM BSEG INTO CORRESPONDING FIELDS OF TABLE GT_PZXM WHERE BUKRS = P_BUKRS AND 如何提高 ABAP 程序运行效率 6 GJAHR = P_GJAHR AND PRCTR IN R_PRCTR AND HKONT IN R_HKONT. 由于缺乏对主键 BELNR( 会计凭证编号 )的条件限制,或使用 FOR ALL ENTRIES 对 BELNR限制 时,数据库查询会非常耗时。 对程序测试分析,耗时情况如下 (图二) : 图二:耗时分析 可见数据库查询耗时 7862

16、1682 微秒( 约等于 1.3 分钟 ) , 可见这样的效率太低了,用户已经无法忍受 这样的 等待 。 改进后的程序( ZD600FIR022_1),提换掉上述耗时的源代码如下: SELECT BUKRS “公司代码 BELNR “会计凭证编号 GJAHR “会计年度 BUZEI “会计凭证中的行项 目号 HKONT “总分类帐帐目 DMBTR “按本位币计的金额 SHKZG “借方 /贷方标识 PRCTR “利润中心 XNEGP “标识 : 反记帐 FROM BSAS INTO CORRESPONDING FIELDS OF TABLE GT_PZXM WHERE BUKRS = P_BU

17、KRS AND GJAHR = P_GJAHR AND PRCTR IN R_PRCTR AND HKONT IN R_HKONT. SELECT BUKRS “公司代码 BELNR “会计凭证编号 GJAHR “会计年度 BUZEI “会计凭证中的行项目号 HKONT “总分类帐帐目 DMBTR “按本位币计的金额 SHKZG “借方 /贷方标识 PRCTR “利润中心 XNEGP “标识 : 反记帐 如何提高 ABAP 程序运行效率 7 FROM BSIS APPENDING CORRESPONDING FIELDS OF TABLE GT_PZXM WHERE BUKRS = P_BUK

18、RS AND GJAHR = P_GJAHR AND PRCTR IN R_PRCTR AND HKONT IN R_HKONT. 这样改为对两个相关透明表的查询,效率有很大的提高。 对程序测试分析,耗时情况如下 (图三) : 图三:耗时分析 整个程序运行下来才 518587 微秒(约等于 0.5 秒), 程序 效率提高了很多 ,相比改进前的程序用户很满意 。 最后需要说明一点,不是所有的 SAP 体统都可以使用这种方法,能否使用取决于 R/3系统的设计和配置。所以在 试图 使用该方法时应充分调查相关透明表与 BSEG 中的纪录是否相符,别速度提高了,结果处理 对象范围减小了或增大了,那就与初

19、衷背道而驰了,效率的提升一定要在确保业务数据正确的基础上再加以考虑。 2.3 测试 开发人员在开发完毕后可以 通过 测试 ,了解程序的运行效率。 SE30 可以对 SAP ABAP 效率测试 ,其中还 包含了许多程序的优化方法 。 尤其是那些 实用的 提示 和 技巧 。 SM66 可以查看正在运行的程序和执行时间 。 ST04 可以对很多会话进行监控 , 单击 : 详细分析清单 , 可以选择分析监控会话 。 比如选择 Oracle 会话 , 可以查看正在执行的 SQL 语句 。 可以单击需要监控的 SQL statement,进入明细 。 然后 单击执行计划 (Ctrl+Shift+F6),

20、可以通过执行计划分析查询效率与使用索引的情况 。 (Ctrl+Shift+F7), 可以追到这条 SQL 语名是哪个程序调用的 。 3 小结 如何提高 ABAP 程序运行效率 8 ABAP 程序会需要花费大量的时间执行 ,而且会使其它进程被迫暂停以等待当前程序运行结束。 对 ABAP 程序的优化 最主要的是尽量减少 I/O 操作 、 内存占用 和 CPU 的负载。类似对硬盘的读写的 I/O 操作是最耗费时间的 , 如果对内存的操作不加以控制,可能有些时候不得不对硬盘的交换空间操作,这样就增加了对磁盘的 I/O 读写操作。 CPU 的负载可以通过优化程 序来改善,在程序中尽量使用诸如 SUM(S

21、QL 语句 )或者 COLLECT(ABAP 语句 )。 尽 可能 把更多选择项放在用户选择界面上,以避免程序一次选出大量的数据 。 如果读出的记录条数在持续增长,你应该把这些数据分割成几个固定大小的数据块。比如说,你想调出一年的数据,就可以按照月份把一年的数据分成 12 个月调出。这样做能减少 I/O 的操作。 最有效率的方法是改善 您 的应用和需求,要使需求合理规范,这才能使效率达到最高化。 参考文献: 1、黄佳、 SAP 程序设计 、机械工业出版社、 2006 年 1 月。 作者简介: 钮顺, 2004 年 毕业于陕西西安西北大学计算机科学与技术专业, 2006 至今在信息管理部担任 ERP 系统开发工作。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 医药卫生

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。