浅谈SAP系统ABAP程序性能优化

2015-10-27 11:36刘金才
电脑知识与技术 2015年21期
关键词:性能优化

刘金才

摘要:该文介绍了SAP系统ABAP程序性能的优化程度对于整个SAP系统的影响,并通过实际案例详细阐述了ABAP程序性能分析、优化的方法。

关键词: SAP系统;ABAP语言;性能优化

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)21-0014-02

SAP是世界上最大的企业解决方案提供商和ERP产品生产商,SAP系统是SAP公司旗下的ERP产品,为越来越多的大中型企业提供全面的业务解决方案,产品中内置了最先进的管理理念和管理流程,融入了各行各业的最佳业务实践,但依然不能完全满足每个企业的个性化的管理需求,因此需要使用SAP系统的专门开发语言ABAP对系统刚进行二次开发。而这些二次开发程序的性能问题容易被忽视并且成为系统的瓶颈,严重影响用户的体验效果,并可能会成为导致SAP系统性能问题的主要因素,使整个系统深受性能困扰甚至瘫痪。所以,保证ABAP程序开发质量、提升程序运行的性能对整个系统的稳定运行至关重要,也是每一个ABAP程序开发者必须要认真考虑、深入研究的重要课题。

1 需优化程序的确定

1)利用数据库的AWR(Automatic Workload Repository)工具监控和搜集系统的运行状况,根据他生成的AWR报告,获得性能表现不好的程序清单。

2)通过作业(SAP_COLLECTOR_FOR_PERFMONITOR)搜集系统运行的统计数据,用ST03或者ST03N查看分析结果,并定位平均资源消耗和总资源消耗比较多的程序清单。

3)通过SM51实时监控运行时间超长的程序清单。

对如上清单中的程序进行综合评估,根据程序资源消耗情况、运行频率、重要性、业务特点、优化历史记录等因素,选中需优化的程序清单,并确定优先级。

2 性能分析

在程序优化之前,要先弄清楚它的功能和核心逻辑,用比较典型的业务场景(常用的查询条件、正常的数据量)对程序进行测试,测试时通过SE30对程序的资源消耗情况进行分析。可以很容易定位性能瓶颈语句,也就是我们要重点优化的语句。

在SE30中,首先可以比较ABAP时间、数据库时间、R/3时间, 哪方面时间占比比较大,我们就优化哪方面。当数据量达到一定级别之后,应用程序主要的资源都是消耗在数据读取上的,所以一般数据库的时间占比是比较大的,程序优化的核心也都是对数据库访问性能的优化。如下图所示:

SE30中提供了一个分析列表,从列表中可以获得每一个程序、子程序、语句的资源消耗情况,我们很容易就能获得资源消耗大户语句,有针对性的优化。

因为用户所能输入的查询条件的组合比较灵活和复杂,所以测试的时候,要尽可能多的选择一些典型的业务场景进行测试,不同的查询条件组合,程序的性能表现会大相径庭,而且资源消耗大户语句也不相同。有时候BUFFER CACHE也会影响我们的判断。所以,要进行反复的测试和分析,才能把性能瓶颈找出来。

3 性能分析

首先就是要把整个程序的代码检查一遍,按照规范技巧对语句进行逐条优化。比如把MOVE-CORRESPONDING语句修改成MOVE语句等。

然后就进行关键查询语句优化。优化前先做测试,记录测试条件和测试结果,以便于优化之后进行对比。

在优化过程中需要反复跟踪关键数据库查询语句的执行计划。这个可以用ST05做。在ST05中可以查看Trace List及关键语句的执行计划。

从TRACE LIST可以监控每一个查询语句的准备(PREPARE,OPEN)和读取数据(FETCH)的时间 ,单位为微秒。

从执行计划中可以看到查询的顺序,索引的使用情况。执行计划是一个有层次关系的树状结构,每一个节点代表一个执行步骤,他的执行顺序为:最右最上最先执行,在同一层级中没有子ID的最先执行,要尽量避免对大表的全表扫描或者Index Full Scan。

4 优化案例

1)增加选择条件查询条件提高索引表的查询性能;把语句中INNER JOIN的表TC24从语句中剥离开来,用For all entries in 单独查询,然后通过循环二叉读的方式合并数据,这种方式牺牲一定的ABAP时间,来换取数据库访问时间,综合性能提升30%左右。

2)有的表比较大,因为分组聚合函数不能用For All Entries In ,所以改成直接用For All Entries In 读取数据,然后再分组。对一个表还进行了两次不同维度的分组, 通过清单读取时因为可以用到唯一索引,所以性能会很快。此优化之后,性能提升一倍以上。

3)当查询时进行表关联时,驱动表所能检索出来的数据越少越好,所以把查询条件放到合适的位置,本实例中表zcrctzdh特别小,但是RESB特别大,当用LGORT作为条件查询时,优化器会把zcrctzdh作为驱动表,所以把LGORT条件加到zcrctzdh表,以达到消减驱动表读取的数据量,最终提升查询的性能。优化之后,如果只按照WERKS和LGORT查询时,性能提升明显。

4)增加索引改变查询计划。如下语句中如果用WERKS和LGORT查询时,优化器会选择最小的表zcrctzdh作为驱动表,出现全表扫描,通过在表zcrctzdi 中增加一个索引(物料号),改变了它的执行计划,系统改为用表zcrctzdi 作为驱动表,并使用该索引进行Index Range Scan查询,此时性能也有显著提升。

5)减少Inner join表的数目,并改变连接查询的驱动表可以提升查询性能。将LTBK从查询中拆离,并把驱动表从LTAK变成LTAP。

6)循环的次数比较多,循环读取的表格比较大时,不用Binary Search 就比较慢,用了Binary Search 方式,性能有很大改善。

5 优化总结

程序性能优化工作就是一项精益求精的工作,是一项比较困难、有挑战性的工作,程序优化者必须有持之以恒、不断探索的精神。性能优化的宗旨就是尽最大可能提升程序的性能。因为程序性能的提升也是有局限的,所以在常规优化效果不明显的情况下就要考虑升级系统软硬件环境、优化数据库、数据归档等措施。

猜你喜欢
性能优化
大数据环境下高校选课系统性能优化应用研究
数据挖掘算法性能优化的研究与应用
SQL Server数据库性能优化的几点分析
Web应用的前端性能优化
WEB网站缓存性能优化
Oracle数据库性能调整与优化分析
基于节点缓存的Web服务器性能优化研究
基于SQL数据库的性能优化的探讨
Oracle数据库应用系统的性能优化
数控机床的结构特征与性能优化策略研究