ABAP程序性能优化研究
姚振+郭骏+刘涛+张禾良+方志远
摘要:文章根据安徽省电力公司ERP系统在运行过程对二次开发程序性能优化方法进行了总结,介绍了ABAP程序性能分析方法,详述ABAP程序常用和非常用性能优化方法,并对程序优化后的运行效果进行了总结。
关键词:ABAP;程序;性能优化
安徽省电力公司企业资源计划(EnterpriseResourcePlanning,ERP)项目自2008年启动实施以来,帮助安徽省电力公司实现了人力资源管理、财务管理、物资管理、项目管理、设备管理及其相关报表与分析等功能,系统设计采用SAP系统(SystemApplicationandProductsinDataProcessing,SAP)R/3系统架构[1]。SAP具有强大的可配置功能,但对于一些特殊的业务需求,需要业务人员配合高级企业应用编程语言(AdvancedBusinessApplicationProgmmming,ABAP)开发人员进行二次开发,随着系统数据量的增长,一些二次开发程序的运行速度变得越来越慢,有的甚至会超过系统最大允许运行时长而超时,不仅影响业务应用的效率也影响了用户体验[2]。因此,对二次开发程序开展性能优化工作是非常有必要的。
1ABAP程序性能分析的手段
对ABAP程序性能进行分析的方法很多,比如事务代码STAD,SE30和ST05等,但目前人们使用最多的是用ST12来分析ABAP程序性能。
ST12的User模式可以跟踪某一个用户,建议不跟踪自己。对于己经开始执行的程序,可以使用Workprocess模式进行跟踪,还能设置跟踪开始和结束时间。Currentmode模式是自己执行指定程序并同时进行跟踪。根据ST12跟踪分析结果,ABAP运行时间过长,一般来说是跟ABAP程序代码运行效率低下有关;Database过长则一般是跟大量直接读取数据库有关系,比如LOOP中Select表数据。Nettime降序排列,找出花费时间最多的代码,然后针对该代码进行优化,对于单纯的报表程序,优化后最好对于同样的输入条件并保证数据量没有太大变化的情况下进行性能比较[3]。
2ABAP程序常用性能优化方法
在Loop循环中使用Where条件减少循环次数,因为减少循环次数可以减少CPU操作次数,减少操作时间。
避免使用Select-EndSelect语句:该语句其实是一个循环体,在数据量很大时会严重影响程序运行速度,而且语句在程序运行过程中会始终保持与数据连接,相当于在一个循环中反复访问数据库,很容易成为程序性能的瓶颈,建议使用一次性Table赋值。避免使用Select*语句,*代表返回所有
字段值,从编程习惯来说,一个优秀的程序员也不应该获取自己不需要的数据,应只返回需要的字段的值。
Read内表建议尽量使用BinarySearch二分法查找,尤其要注意的一点的是,在使用二分法之前一定要对内表进行排序,否则有可能找不到正确数据。
对Loop嵌套循环,尽量带Where条件,但如果数据量很大,可能带了条件还是会很慢,甚至成为程序运行缓慢的瓶颈,这种情况建议根据BinarySearch二分法定位位置,然后再Loop,会大大提升查询速度。
Jom连接使用:用Jom进行表连接使用很频繁,但簇表不能直接使用Jom,比如BSEG表,如果要查询BSEG表数据,只能直接查询。进行表关联时建议使用InnerJoin,无特殊业务需要不要使用LeftJoin,因为InnerJoin只连接匹配的行,而LeftJoin则会包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),所以使用InnerJom内连接会显著降低系统的负载,提升程序性能。需注意的一点是Jom超过3个表会出现性能问题,超过3个建议使用ForAllEntriesIn,再在Loop中通过二分法来Read内表获取需要的数据。
关于ForAllEntriesIn的使用:一定要首先判断内表是否为空,如果为空,系统会视为无条件全表查询,如果是数据量不大的表,影响可能并不是很大,但如果是数据量非常大的表,比如BSEG和MSEG表,则会严重影响系统性能;当内表数据比较多时建议对其查询条件排序去重,尽量去掉条件重复项,因为系统处理的时候是在Where中使用OR来查询数据,如果数据太多会占用大量系统内存。
关于索引的使用:在对表进行查询时如果表中有索引尽量在Where查询条件中使用索引。使用索引的优点是可以使对应表的SQL语句执行得更快,缺点是会占用额外的数据库空间,还会降低数据修改和插入的速度,所以新建索引需要考虑必要性和实用性,并非越多越好,建议尽量使用表中己有的索引。对于字段多而且数据量很大的系统标准表,比如MSEG表,库存和财务的数据均存储在该表,在新建索引时更要慎重。创建索引时需考虑字段的顺序,客户端MANDT必须放在第一位,其他字段顺序根据业务实际需要来确定,且索引字段不宜过多,建议不超过5个。在Where的查询条件中字段的顺序最好跟索引里面的关键字保持一致,否则索引可能无效。
按时间区间获取数据:以PROJ表为例,如果一次性取出所有数据,后续再关联PRPS,MSEG等表查询其他数据,运行速度可能非常慢,但如果根据ERDAT(创建时间)分时间区间如20170101到20170331查询,查询速度提升了一个等级。
适当以空间换时间:以MSEG表为例,退料总金额只能从该表查詢数据,使用常规优化方法根本无法满足业务需要,经分析只需获取BWART(移动类型)为222的数据,数据总计30万条,一次性查询数据到内表二分法排序Read,速度提升几十倍。使用完成后应及时清空释放内表所占用的空间[4]。
3ABAP程序其他性能优化方法
在安徽省电力公司ERP系统中有很多二次开发的报表,有些报表运行非常耗时,采用常规优化方法己经无法进一步提升运行速度,这就需要采用一些其他的非常规技术手段来进行优化。
SAP系统并未限制用户登录次数,一个用户可以多机登录系统。比如项目创建程序是通过导入EXCEL模板数据完成项目创建,有的用户多机登录,同时打开多个窗口导入数据,并发数过多导致服务器工作进程资源占用过大,NRIV表无法及时释放。此情况无法通过程序优化达到应有的效果,因为项目创建调用的是标准函数,无法对标准程序进行优化,但可以采用限制程序的运行个数来控制并发数,减轻服务器和数据库压力。
控制单个用户执行个数。如用户正在运行程序,提示用户“该程序同时只能运行一个,您己经在运行该程序”。实现方法如下:首先调用系统标准函数“ENQUEUE_ESINDX”,该函数可判断程序是否锁定,如果程序己经在运行,再调用系统标准函数“ENQUE_READ”,根据返回的TABLE值ENQ,循环ENQ内表,如果GUNAME等于当前用户名,则表示用户己经在执行该程序。
控制程序报表执行总数。自定义新建一个配置表,新增程序名称和最大允许同时执行次数两列,例如报表A,100,表示报表A最多只能同时运行100个,超过该数量系统提示“服务器达到最大会话数,请稍候再试”信息。实现方法如下:在程序中调用系统标准函数“TH_WPINFO”,根据TABLE返回值WPLIST,再循环WPLIST内表,根据WP_REPORT值等于当前程序名来汇总,如果等于100说明己达最大值,否则允许用户继续执行。
为尽量减少并发数过多影响系统性能,建议根据实际情况在代码中适当加入“WAITUPTONSECONDS”语句,强制增加等待时间。该语句对在LOOP循环中调用BAPI过账特别有效,比如调用“BAPI_GOODSMVT_CREATE”函数生成物料凭证。
对于实时性要求不高但查询比较耗时的报表可以考虑把程序放到后台运行。实现方法如下:首先调用系统标准函数“JOB_OPEN”新建一个后台作业,再执行计算逻辑,最后调用系统标准函数“J0B_CL0SE”关闭后台作业[5]。
4结语
本文对人们在日常工作中的ABAP程序性能优化的常见和非常见的性能优化方法进行了总结,程序优化后运行速度有了显著的提升,优化效果明显。但也应考虑到程序优化不是万能的,仅仅依靠程序优化并不能完全解决程序性能问题。
影响ERP系统运行速度的因素很多,比如网络的传输速率,影响网络传输速率的因素主要有带宽、时延和丢包;Oracle数据库性能,通过参数的调整达到性能的优化;Basis系统性能优化和应用服务器硬件配置等。为了进一步提升系统性能,应该把以上这些因素都考虑到。
[参考文献]
[1]黄佳.SAP程序设计[M].北京:机械工业出版社,2005.
[2]李娜娜,李长海.ABAP编程中提高效率的几个技巧[J].数字技术与应用,2010(4):37-38.
[3]潘吴,易泽湘.基于SAPR/3的ERP技术研究与应用[J]计算机技术与发展,2006(7):59-60.
[4]于慧,廖華元,陈刚.提高SAP系统ABAP程序性的方法研究[J].中国科技信息,2013(23):91-94.
[5]邹玉龙,王昕蟲.SAPABAP程序优化方法的研究及应用[J].电脑知识与技术,2011(22):5496-5498.