您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > SAP-ABAP性能优化
ABAP程序性能优化目录一.前言二.程序性能优化的重点三.怎样降低CPU负载四.怎样降低DB负载五.怎样降低程序内存使用六.怎样检查程序性能第2页本文提供一些常用的方法,用以提高ABAP程序运行速度、降低系统荷载、节省内存开销。但这些方法不是孤立的,我们的最终的目的是在三者之间达到一种平衡。一.前言第3页第4页二.程序性能效率优化的重点降低CPU负载(减少循环次数)降低数据库负载(减少IO操作)内存使用的优化(减少内表大小)SAP系统三层架构第5页三.怎样降低CPU负载侧重于程序语句处理逻辑:减少循环次数1.使用WHERE条件减少循环次数;2.尽量避免使用MOVE-CORRESPONDING和INTOCORRESPONDINGFIELDSOF;3.使用SORTEDTABLE和HASHEDTABLE表类型;4.使用BINARYSEARCH二分查找算法;5.使用较高效的DELETEADJACENTDUPLICATESFROM删除内表邻近重复记录;6.使用较高效的COLLECT语句对记录进行聚集加总;7.嵌套loop语句,可以用先read在loopatfrom。减低CPU负载-1使用WHERE条件减少循环次数.减少循环次数可以减少CPU操作次数,减少操作时间LOOPATitab…WHERE…SELECTION-OPTIONS:s_vbelnFORvbak-vbeln.LOOPATitab.IFitab-vbelnINs_vbeln.……ENDIF.ENDLOOP.SELECTION-OPTIONS:s_vbelnFORvbak-vbeln.LOOPATitabWHEREvbelnINs_vbeln.……ENDLOOP.不推荐推荐第6页降低CPU负载-2尽量避免使用MOVE-CORRESPONDING和INTOCORRESPONDINGFIELDSOF.CORRESPONDING语句在系统内部存在隐式操作:1,检查元素名称匹配;2,检查元素类型匹配;3,元素类型转换;SELECT*INTOCORRESPONDINGFIELDSOFTABLEitabFROMvbakWHEREvbeln=p_vbeln.LOOPATitab1INTOwa.MOVE-CORRESPONDINGwatoitab2.APPENDitab2.ENDLOOP.SELECTvbelnposnrINTOTABLEitabFROMvbakWHEREvbeln=p_vbeln.Itab2=itab1.SELECTvbelnasfld1posnrasfld2INTOTABLEitabFROMvbakWHEREvbeln=p_vbeln.LOOPATitab1INTOwa.Itab2-fld1=wa-matnr.Itab2-fld2=wa-meinsAPPENDitab2.ENDLOOP.不推荐推荐推荐第7页降低CPU负载-3使用SORTEDTABLE和HASHEDTABLE表类型.第8页降低CPU负载-4使用BINARYSEARCH二分查找算法.一般线性查找的缺点就是耗时,而二分查找比线性查找更高效.READTABLEitab2WITHKEYvbeln=Itab1-vbelnANDposnr=itab1-posnr.时间复杂度为O(n)阶.SORTTABLEitab2BYvbelnposnr.READTABLEitab2WITHKEYvbeln=Itab1-vbelnANDposnr=itab1-posnrBINARYSEARCH.时间复杂度为O(logn)阶。注意:使用BINARYSEARCH前必须对内表进行按索引排序.不推荐推荐第9页降低CPU负载-5使用较高效的DELETEADJACENTDUPLICATESFROM删除内表邻近重复记录.注意:使用前必须要对内表先进按索引排序SORTITABBYXXXX.第10页降低CPU负载-6使用较高效的COLLECT语句对记录进行聚集加总.注意:COLLECT语句的效率只体现在当你使用的是顺序表和哈希表的时候,或者内表经过有效排序之后。否则当内表数据过多时,检索时间会很长,一般不推荐使用在记录条数非常多的标准表。第11页降低CPU负载-7嵌套loop语句,可以用先read在loopat…fromsy-tabix方法处理,可以有效减少循环次数。第12页第13页四.怎样降低数据库负载侧重于SQL语句逻辑:减少IO操作1.避免使用SELECT…ENDSELECT语句;2.避免使用SELECT*;3.使用FORALLENTRIESIN语句联接数据表和内表;4.使用索引提高查询效率;5.避免使用SQL的ORDERBY语句,SORT语句会更高效;6.使用SQL聚合函数MAX,MIN,COUNT,AVG,SUM。降低数据库负载-1避免使用SELECT…ENDSELECT语句.SELECTENDSELECT语句其实是一个循环体,为了减少循环次数,建议使用一次性TABLE赋值赋值.SELECTebelnINTOit_ebeln-ekkebelnFROMekkoWHEREebeln=p_ebeln.APPENDit_ebeln.ENDSELECT.SELECTebelnASekknebelnINTOTABLEit_ebelnFROMekkoWHEREebeln=p_ebeln.不推荐推荐第14页降低数据库负载-2避免使用SELECT*.第15页降低数据库负载-3.1使用FORALLENTRIESIN语句联接数据表和内表.第16页降低数据库负载-3.2使用FORALLENTRIESIN语句联接数据表和内表.第17页降低数据库负载-3.3使用FORALLENTRIESIN语句联接数据表和内表.使用的时机:1,簇表是禁止JOIN的表类型,当需要联接簇表查询数据时;2,JOIN超过3个表会出现性能问题,当使用JOIN联接的表超过3个时;SELECT…INTOitabFROMEKKOJOINEKPOONEKKO~EBELN=EKPO~EBELNJOINEKKNON……JOINMARAON…………SELECT…INTOTABLEitab_ekkoFROMekko.SELECT…INTOTABLEitab_ekpoFROMekpoFORALLENTERISINitab_ekkoWHEREebeln=itab_ekko-ebeln……LOOPATitab_ekko.READitab_ekpoWITHKEYebeln=itab_ekko.……APPENDitab.ENDLOOP.不推荐推荐第18页降低数据库负载-4.1使用索引提高查询效率.第19页降低数据库负载-4.2使用索引提高查询效率.SQL查询语句的WHERE条件按照INDEX的顺序书写。SELECT……FROMEKKOWHEREMANDT=SY-MANDTANDLIFNR=‘XXXXXXX’ANDEKORG=‘2701’ANDEKGRP=‘XXX’......第20页降低数据库负载-5避免使用SQL的ORDERBY语句,SORT语句会更高效.第21页降低数据库负载-6使用SQL聚合函数MAX,MIN,COUNT,AVG,SUM.第22页第23页五.怎样降低程序内存使用侧重于内表的操作技巧:减少内表大小1.使用OCCURSn与OCCURS0的区别;2.使用SELECT…PACKAGESIZEn分段查询数据,减低数据库缓存负担;3.使用完成后及时清空释放内表。程序内存使用的优化-1使用OCCURSn与OCCURS0的区别。OCCURSn代表初始化内表的空间大小为n(空间固定),当内表存储记录条数超出n时,系统将依靠页面文件存放超出部分的数据。当系统内存资源十分紧缺的时候,我们可以使用OCCURSn的初始化方法,但是这样的效率稍微慢。OCCURS0代表初始化内表的空间大小为无限,当内表存储记录条数不断增加时,内表所使用的内存空间不断扩大,直到系统无法分配为止。使用内存比使用页面交换更快一些,但是要考虑系统的资源状态。第24页程序内存使用的优化-2使用SELECT…PACKAGESIZEn分段查询数据,减低数据库缓存负担.SELECT……INTOTABLEitabPACKAGESIZE100FROMVABK……该语句实现没次打开DB会话时,往应用服务器上传输100条记录,然后关闭会话,刷新缓存。用于在数据库缓存资源紧缺的情况使用。第25页程序内存使用的优化-3使用完成后及时清空释放内表RefreshITAB;FreeITAB.可以有效减少内存的持续占用,从而提高内存分配使用小率。第26页结束句谢谢!
本文标题:SAP-ABAP性能优化
链接地址:https://www.777doc.com/doc-4601155 .html