【摘 要】影響ABAP程序運(yùn)行效率的因素及相應(yīng)的優(yōu)化方法。
【關(guān)鍵詞】ABAP;優(yōu)化;查詢;主鍵
0.引言
ABAP是Advanced Business Application Programming(高級商務(wù)應(yīng)用程序)的縮寫,它是一款基于SAP平臺的編程語言,由德國SAP公司開發(fā),主要用于SAP系統(tǒng)中報(bào)表程序的編寫開發(fā)。不同行業(yè)領(lǐng)域的用戶在使用SAP系統(tǒng)時(shí),會提出不同的報(bào)表需求,SAP的標(biāo)準(zhǔn)報(bào)表更側(cè)重通用性,專業(yè)性能不強(qiáng),這就需要應(yīng)用ABAP語言為用戶量身訂做各個(gè)專業(yè)報(bào)表。
ABAP報(bào)表開發(fā)往往要基于SAP系統(tǒng)中自帶的數(shù)據(jù)庫表。這些表都是SAP系統(tǒng)創(chuàng)建好的,隨著SAP系統(tǒng)的安裝,這些表也被安裝到了SAP服務(wù)器上。ABAP程序員沒有對這些表的修改權(quán)限,只有使用(即select)權(quán)限,所以對于ABAP程序員來說,如何在數(shù)以萬計(jì)的數(shù)據(jù)庫表中快速地提取有效的信息,并通過相關(guān)計(jì)算,把它們有序的排列出來,再展示給用戶,才是關(guān)鍵。
1.優(yōu)化方法
想要優(yōu)化ABAP程序,就必須清楚影響ABAP程序運(yùn)行效率的因素及相應(yīng)的優(yōu)化方法。筆者經(jīng)過兩年的切身實(shí)踐,體會最深的有以下幾點(diǎn):
1.1非主鍵和索引查詢
有很多用戶都希望通過一些非主鍵或者索引的字段進(jìn)行查詢,這種查詢的效率是很低的。這就好比從一本字典中查找漢字卻不使用檢字法一樣。
優(yōu)化方法:
程序員可以建議用戶盡量使用主鍵或者索引進(jìn)行查詢。如果有些情況確實(shí)需要非主鍵或者索引進(jìn)行查詢,那么可以借助中間表把非主鍵和索引轉(zhuǎn)換成主鍵或者索引,再進(jìn)行查詢。如用戶想根據(jù)采購訂單字段(EBELN)查詢物料的收貨情況,而物料憑證表(MSEG)中,EBELN既不是主鍵,也不是索引,那么在使用EBELN對MSEG表進(jìn)行查詢時(shí),效率很低,那么我們可以借助表EKBE(采購憑證的收貨記錄表)作為中間表,因?yàn)镋BELN字段在EKBE表中是第一個(gè)主鍵字段,這樣取數(shù)效率就大大增加了。
1.2循環(huán)取數(shù)
簡單的說,就是對數(shù)據(jù)庫表中的記錄進(jìn)行循環(huán),把符合條件的記錄取出來,每次只取一條。這種取數(shù)方式會把數(shù)據(jù)庫表中的所有記錄循環(huán)一遍,這樣的方式大大降低的程序運(yùn)行效率。所以即便是在數(shù)據(jù)量不是很大的表中取數(shù),也不要采用這個(gè)方式。
優(yōu)化方法:
采用集中取數(shù)的方式,把有用的數(shù)據(jù)一次性全部取出來,這樣,我們實(shí)際上只花費(fèi)了取一兩條記錄的時(shí)間,卻得到了需要的所有記錄。
1.3龐大的數(shù)據(jù)量
在SAP的標(biāo)準(zhǔn)數(shù)據(jù)庫表中有很多表的數(shù)據(jù)量是相當(dāng)龐大的,如BSEG、CDPOS、MSEG等,這些表在ABAP字典中的數(shù)據(jù)量幾乎是成倍增長的。在有些單位,這些表的數(shù)據(jù)量每天都在以成百成千的速度增加。那么,從這樣的表中取數(shù)的速度會比其它表慢一些。
優(yōu)化方法:
在非必要的情況下,盡量減少對這些表的使用。必須使用的時(shí)候,盡量使用主鍵或者索引進(jìn)行查詢。
1.4非關(guān)系表聯(lián)合取數(shù)
有些時(shí)候,為了方便取數(shù),程序員經(jīng)常會把多張表聯(lián)合起來取數(shù),這樣的確可以提高效率,但是需要注意的是,如果聯(lián)合在一起的數(shù)據(jù)庫表中有非關(guān)系表,那么效率不但不會提高,反而會大大降低。
所謂關(guān)系表,是指主鍵或者索引存在相同字段的表,這些表在聯(lián)合取數(shù)是按照主鍵或者索引進(jìn)行關(guān)聯(lián),可以把多張表中的信息組合到一起,這樣來提高取數(shù)效率,如MKPF和MSEG,這兩張表中,前者的主鍵也是后者的主鍵,盡管這兩張表的數(shù)據(jù)量都很大,但是由于主鍵關(guān)聯(lián),取數(shù)時(shí)的效率并沒有受到多大影響。但是對于非關(guān)系表,情況就截然相反。
優(yōu)化方法:
可以借助中間表把非關(guān)系表轉(zhuǎn)換成關(guān)系表,如果找不到中間表,就把查詢時(shí)用到的表按照關(guān)聯(lián)關(guān)系進(jìn)行劃分,把關(guān)系表放在一起取數(shù),多取一次也好過非關(guān)系表聯(lián)合取數(shù)。
1.5循環(huán)嵌套
有些時(shí)候,需要在循環(huán)一張表的同時(shí),再循環(huán)另一張表,這樣,實(shí)際的循環(huán)次數(shù)就是外層表的循環(huán)次數(shù)乘以內(nèi)層表的循環(huán)次數(shù),運(yùn)算量成倍增長,運(yùn)行效率自然降了下來。
優(yōu)化方法:
外層表循環(huán)的時(shí)候,內(nèi)層表盡量采用讀表(read)的方式,這樣不會增加循環(huán)次數(shù),必須循環(huán)內(nèi)層表的時(shí)候,最好寫出跳出內(nèi)層循環(huán)(exit)的條件,以減少循環(huán)次數(shù)。
1.6重復(fù)代碼
有時(shí)候我們會發(fā)現(xiàn)這樣的問題:某段代碼在同一個(gè)程序的不同位置重復(fù)出現(xiàn),有時(shí)會重復(fù)多次。這樣就造成的代碼冗余,不利于代碼的修改和維護(hù)。
優(yōu)化方法:
把相同的代碼寫在一個(gè)類(class)、方法(method)、函數(shù)(function)或者子程序(subroutine)里面,設(shè)置傳遞參數(shù),在程序中采用調(diào)用的方式,以參數(shù)傳遞方式運(yùn)行,這樣便于代碼管理和維護(hù)。
1.7無效代碼
無效代碼也稱垃圾代碼,這些代碼一般是在代碼維護(hù)時(shí)漏掉的,它占用的系統(tǒng)資源卻沒有發(fā)揮作用。
優(yōu)化方法:
注釋掉或者直接刪除。
2.結(jié)論
ABAP程序?yàn)镾AP提供了報(bào)表開發(fā)功能,使各個(gè)行業(yè)領(lǐng)域都可以在SAP中開發(fā)自身需要的報(bào)表。了解和掌握了影響ABAP程序運(yùn)行效率的因素,對于ABAP的開發(fā)和快速運(yùn)行,是大有裨益的。
ABAP程序的優(yōu)化縮短了程序運(yùn)行周期,提高了運(yùn)行效率,節(jié)省了系統(tǒng)資源,降低了運(yùn)行成本。