劉金才
摘要:該文介紹了SAP系統(tǒng)ABAP程序性能的優(yōu)化程度對(duì)于整個(gè)SAP系統(tǒng)的影響,并通過實(shí)際案例詳細(xì)闡述了ABAP程序性能分析、優(yōu)化的方法。
關(guān)鍵詞: SAP系統(tǒng);ABAP語言;性能優(yōu)化
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)21-0014-02
SAP是世界上最大的企業(yè)解決方案提供商和ERP產(chǎn)品生產(chǎn)商,SAP系統(tǒng)是SAP公司旗下的ERP產(chǎn)品,為越來越多的大中型企業(yè)提供全面的業(yè)務(wù)解決方案,產(chǎn)品中內(nèi)置了最先進(jìn)的管理理念和管理流程,融入了各行各業(yè)的最佳業(yè)務(wù)實(shí)踐,但依然不能完全滿足每個(gè)企業(yè)的個(gè)性化的管理需求,因此需要使用SAP系統(tǒng)的專門開發(fā)語言ABAP對(duì)系統(tǒng)剛進(jìn)行二次開發(fā)。而這些二次開發(fā)程序的性能問題容易被忽視并且成為系統(tǒng)的瓶頸,嚴(yán)重影響用戶的體驗(yàn)效果,并可能會(huì)成為導(dǎo)致SAP系統(tǒng)性能問題的主要因素,使整個(gè)系統(tǒng)深受性能困擾甚至癱瘓。所以,保證ABAP程序開發(fā)質(zhì)量、提升程序運(yùn)行的性能對(duì)整個(gè)系統(tǒng)的穩(wěn)定運(yùn)行至關(guān)重要,也是每一個(gè)ABAP程序開發(fā)者必須要認(rèn)真考慮、深入研究的重要課題。
1 需優(yōu)化程序的確定
1)利用數(shù)據(jù)庫的AWR(Automatic Workload Repository)工具監(jiān)控和搜集系統(tǒng)的運(yùn)行狀況,根據(jù)他生成的AWR報(bào)告,獲得性能表現(xiàn)不好的程序清單。
2)通過作業(yè)(SAP_COLLECTOR_FOR_PERFMONITOR)搜集系統(tǒng)運(yùn)行的統(tǒng)計(jì)數(shù)據(jù),用ST03或者ST03N查看分析結(jié)果,并定位平均資源消耗和總資源消耗比較多的程序清單。
3)通過SM51實(shí)時(shí)監(jiān)控運(yùn)行時(shí)間超長的程序清單。
對(duì)如上清單中的程序進(jìn)行綜合評(píng)估,根據(jù)程序資源消耗情況、運(yùn)行頻率、重要性、業(yè)務(wù)特點(diǎn)、優(yōu)化歷史記錄等因素,選中需優(yōu)化的程序清單,并確定優(yōu)先級(jí)。
2 性能分析
在程序優(yōu)化之前,要先弄清楚它的功能和核心邏輯,用比較典型的業(yè)務(wù)場(chǎng)景(常用的查詢條件、正常的數(shù)據(jù)量)對(duì)程序進(jìn)行測(cè)試,測(cè)試時(shí)通過SE30對(duì)程序的資源消耗情況進(jìn)行分析??梢院苋菀锥ㄎ恍阅芷款i語句,也就是我們要重點(diǎn)優(yōu)化的語句。
在SE30中,首先可以比較ABAP時(shí)間、數(shù)據(jù)庫時(shí)間、R/3時(shí)間, 哪方面時(shí)間占比比較大,我們就優(yōu)化哪方面。當(dāng)數(shù)據(jù)量達(dá)到一定級(jí)別之后,應(yīng)用程序主要的資源都是消耗在數(shù)據(jù)讀取上的,所以一般數(shù)據(jù)庫的時(shí)間占比是比較大的,程序優(yōu)化的核心也都是對(duì)數(shù)據(jù)庫訪問性能的優(yōu)化。如下圖所示:
SE30中提供了一個(gè)分析列表,從列表中可以獲得每一個(gè)程序、子程序、語句的資源消耗情況,我們很容易就能獲得資源消耗大戶語句,有針對(duì)性的優(yōu)化。
因?yàn)橛脩羲茌斎氲牟樵儣l件的組合比較靈活和復(fù)雜,所以測(cè)試的時(shí)候,要盡可能多的選擇一些典型的業(yè)務(wù)場(chǎng)景進(jìn)行測(cè)試,不同的查詢條件組合,程序的性能表現(xiàn)會(huì)大相徑庭,而且資源消耗大戶語句也不相同。有時(shí)候BUFFER CACHE也會(huì)影響我們的判斷。所以,要進(jìn)行反復(fù)的測(cè)試和分析,才能把性能瓶頸找出來。
3 性能分析
首先就是要把整個(gè)程序的代碼檢查一遍,按照規(guī)范技巧對(duì)語句進(jìn)行逐條優(yōu)化。比如把MOVE-CORRESPONDING語句修改成MOVE語句等。
然后就進(jìn)行關(guān)鍵查詢語句優(yōu)化。優(yōu)化前先做測(cè)試,記錄測(cè)試條件和測(cè)試結(jié)果,以便于優(yōu)化之后進(jìn)行對(duì)比。
在優(yōu)化過程中需要反復(fù)跟蹤關(guān)鍵數(shù)據(jù)庫查詢語句的執(zhí)行計(jì)劃。這個(gè)可以用ST05做。在ST05中可以查看Trace List及關(guān)鍵語句的執(zhí)行計(jì)劃。
從TRACE LIST可以監(jiān)控每一個(gè)查詢語句的準(zhǔn)備(PREPARE,OPEN)和讀取數(shù)據(jù)(FETCH)的時(shí)間 ,單位為微秒。
從執(zhí)行計(jì)劃中可以看到查詢的順序,索引的使用情況。執(zhí)行計(jì)劃是一個(gè)有層次關(guān)系的樹狀結(jié)構(gòu),每一個(gè)節(jié)點(diǎn)代表一個(gè)執(zhí)行步驟,他的執(zhí)行順序?yàn)椋鹤钣易钌献钕葓?zhí)行,在同一層級(jí)中沒有子ID的最先執(zhí)行,要盡量避免對(duì)大表的全表掃描或者Index Full Scan。
4 優(yōu)化案例
1)增加選擇條件查詢條件提高索引表的查詢性能;把語句中INNER JOIN的表TC24從語句中剝離開來,用For all entries in 單獨(dú)查詢,然后通過循環(huán)二叉讀的方式合并數(shù)據(jù),這種方式犧牲一定的ABAP時(shí)間,來換取數(shù)據(jù)庫訪問時(shí)間,綜合性能提升30%左右。
2)有的表比較大,因?yàn)榉纸M聚合函數(shù)不能用For All Entries In ,所以改成直接用For All Entries In 讀取數(shù)據(jù),然后再分組。對(duì)一個(gè)表還進(jìn)行了兩次不同維度的分組, 通過清單讀取時(shí)因?yàn)榭梢杂玫轿ㄒ凰饕?,所以性能?huì)很快。此優(yōu)化之后,性能提升一倍以上。
3)當(dāng)查詢時(shí)進(jìn)行表關(guān)聯(lián)時(shí),驅(qū)動(dòng)表所能檢索出來的數(shù)據(jù)越少越好,所以把查詢條件放到合適的位置,本實(shí)例中表zcrctzdh特別小,但是RESB特別大,當(dāng)用LGORT作為條件查詢時(shí),優(yōu)化器會(huì)把zcrctzdh作為驅(qū)動(dòng)表,所以把LGORT條件加到zcrctzdh表,以達(dá)到消減驅(qū)動(dòng)表讀取的數(shù)據(jù)量,最終提升查詢的性能。優(yōu)化之后,如果只按照WERKS和LGORT查詢時(shí),性能提升明顯。
4)增加索引改變查詢計(jì)劃。如下語句中如果用WERKS和LGORT查詢時(shí),優(yōu)化器會(huì)選擇最小的表zcrctzdh作為驅(qū)動(dòng)表,出現(xiàn)全表掃描,通過在表zcrctzdi 中增加一個(gè)索引(物料號(hào)),改變了它的執(zhí)行計(jì)劃,系統(tǒng)改為用表zcrctzdi 作為驅(qū)動(dòng)表,并使用該索引進(jìn)行Index Range Scan查詢,此時(shí)性能也有顯著提升。
5)減少Inner join表的數(shù)目,并改變連接查詢的驅(qū)動(dòng)表可以提升查詢性能。將LTBK從查詢中拆離,并把驅(qū)動(dòng)表從LTAK變成LTAP。
6)循環(huán)的次數(shù)比較多,循環(huán)讀取的表格比較大時(shí),不用Binary Search 就比較慢,用了Binary Search 方式,性能有很大改善。
5 優(yōu)化總結(jié)
程序性能優(yōu)化工作就是一項(xiàng)精益求精的工作,是一項(xiàng)比較困難、有挑戰(zhàn)性的工作,程序優(yōu)化者必須有持之以恒、不斷探索的精神。性能優(yōu)化的宗旨就是盡最大可能提升程序的性能。因?yàn)槌绦蛐阅艿奶嵘彩怯芯窒薜?,所以在常?guī)優(yōu)化效果不明顯的情況下就要考慮升級(jí)系統(tǒng)軟硬件環(huán)境、優(yōu)化數(shù)據(jù)庫、數(shù)據(jù)歸檔等措施。