姚振+郭駿+劉濤+張禾良+方志遠
摘要:文章根據安徽省電力公司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系統中有很多二次開發的報表,有些報表運行非常耗時,采用常規優化方法己經無法進一步提升運行速度,這就需要采用一些其他的非常規技術手段來進行優化。endprint
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.endprint