ABAP performance学习笔记
一,盡量杜絕使用select...endselect的實用方法而使用internal table.
二,Loop里面不要嵌套select.可以首先使用for all entry in的方法將select的內容放置到internal table中,然后對該table進行排序,最后在loop里面使用read table ....with key ...binary search的方法。(此方法有一個例外,在外層loop數據量大的情況下,如果loop里面嵌套的select每次只讀取出幾條數據,而使用for all entry in的方法讀取出來的數據量十分龐大的時候,在使用read table binary seach的方法可能會造成內存不足從而dump的情況。該結論未經證實。而是同事得出的結論:loop的內表中有100多萬條數據,loop里面select時每次只讀出了幾條,而使用for all entry in的情況下則讀出了好幾百萬條的數據,最后造成了內存不足的情況。我的意見:遇到該種情況可以實際動手對兩種情況進行一些測試比較)
三,使用select讀取表數據的時候盡量使用主鍵或者index.如何判斷index是否有作用以后抽時間在講。
四,避免Loop里面套Loop的方法或者是Loop里面嵌套delete table where ...。可以使用field symbols來解決該問題。這一招實際應用中非常有效果。具體如何實現請參考如下代碼:
LOOP?AT?itab.
????DELETE?itab1?WHERE?matnr?=?itab-matnr?AND
????????????????????????vbeln?=?itab-vbeln?AND
????????????????????????posnr?=?itab-posnr.
ENDLOOP.
Recommendation:
field-symbols <fs> like line of itab.
field-symbols <fs1> like line of itab1.
loop at itab assigning <fs>.
? read table itab1 transporting no fields binary search with
?????????????????????? ????????????????????key matnr = <fs>-matnr
???????????????????? ??????????????????????????vbeln = <fs>-vbeln
?????????????????????????????????????????????? posnr = <fs>-posnr.
? lf_from_index = sy-tabix.
? if sy-subrc eq 0.
??? loop at itab1 assigning <fs1> from lf_from_index.
????? if not ( <fs1>-matnr = <fs>- matnr and <fs1>-vbeln = <fs>-vbeln and
?????????????? <fs1>-posnr = <fs>-posnr ).
??????? exit.
????? endif.
????? <delete>
??? endloop.
?endif.
endloop.
五,使用for all entry in的時候切記兩點:使用DELETE ADJACENT DUPLICATES FROM刪除從表中的重復記錄,以及使用if not interanl table is initial判斷主表是否為空,只要在主表不為空的情況下才執(zhí)行。
今天先記錄如下,沒有經過整理的,憑著記憶寫的,以后再補充.
總結
以上是生活随笔為你收集整理的ABAP performance学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: System tuning中经常用到的一
- 下一篇: Idoc学习笔记----获取查询Idoc