【06】SAP ABAP性能優化 - 內存管理 (ABAP Memory vs. SAP Memory)

1. 基礎知識:

ABAP程序在首次執行前(或新版本激活後,再次執行時),會經歷編譯的過程,生成一個可執行對象LOAD, 這個可執行對象是存儲在應用服務器AS的buffer裏的。

其實對於運行環境而言,ABAP程序由兩部分組成:一部分是固定不可修改的,例如編譯後的可執行代碼、程序中的文本、常量等等,這些內容會存儲在PXA(Program Execution Area)中。另一部分,對程序而言,是可能發生變化的內容,例如程序運行中的變量等,這一部分的內容會存儲在Roll Area中。

當同一個程序被併發執行多次時(被1個User同時執行多次,或者多個User同時併發單獨執行),都會爲每次一運行分配獨立的Roll Area. 這也就是不同user同時執行一個相同的程序時,並不會相互干擾的原因。

2. External Session vs. Internal Session

學習ABAP Memory和SAP Memory,首先要區分External Session和Internal Session的概念。

  • External Session: 一個External Session就是一個獨立的GUI Window. 在SAP GUI中默認定義最大可有6個External Session,也即最多可以有6個獨立的GUI Window。當然,這個是可以由Basis配置的,因爲在SAP NW 7.0以上的版本,最多可以支持16個External Session。
  • Internal Session:在一個External Session中,又可以有多個Internal Session。在ABAP程序中,可以通過SUBMIT, CALL TRANSACTION等方式產生新的internal session,系統對於每一個Internal Session會分配單獨的Roll Area。ABAP中,在一個program中,最多可以有9個Internal Session.

產生Internal Session的語法,區別如下:

執行完會返回 執行完不會返回
SUBMIT program_name AND RETURN SUBMIT program_name **
CALL TRANSACTION tran_name LEAVE TO TRANSACTION tran_name

3. ABAP Memory vs. SAP Memory

ABAP Memory是Internal Session間可共有的內存空間;而SAP Memory是External Session間可共有的內存空間,它們的關係見下圖:
在這裏插入圖片描述
可以使用ABAP在Internal Session見進行數據傳遞,當前Session結束後,ABAP Memory會自動釋放。

可以使用FREE MEMORY ID xxx的方式進行手動釋放。

下面給出了一個利用ABAP memory進行數據傳遞的例子。

REPORT ztest_calculate_main.
**********************************************************************
* ABAP Memory
**********************************************************************
DATA: lv_a TYPE i,
      lv_b TYPE i.

lv_a = 1.
lv_b = 2.

EXPORT val_1 = lv_a
       val_2 = lv_b
       TO MEMORY ID 'test_val_id'.

SUBMIT ztest_calculate AND RETURN.

WRITE: / 'run successfully.'.
REPORT ztest_calculate.

DATA: lv_val_1 TYPE i,
      lv_val_2 TYPE i,
      lv_sum   TYPE i.

IMPORT val_1 = lv_val_1
       val_2 = lv_val_2
       FROM MEMORY ID 'test_val_id'.

lv_sum = lv_val_1 + lv_val_2.

WRITE:/ 'result = ', lv_sum.

可以使用SAP Memory在External Session間進行數據傳遞,例如在SU3中維護的user parameter其實就是使用的SAP Memory。

SAP Memory在user退出系統登錄後自動釋放。

** In external session 1 - Set 
DATA: ls_bkpf TYPE bkpf.
  SET PARAMETER ID 'BUK' FIELD ls_bkpf-bukrs.


** In external session 2 - Get 
DATA: ls_header TYPE bkpf.
  Get PARAMETER ID 'BUK' FIELD ls_header-bukrs.

當然,也可以使用SAP Memory在Internal Session間進行值的傳遞,如下例:

**********************************************************************
* SAP Memory
**********************************************************************
DATA: ls_bkpf TYPE bkpf.

SELECT * FROM bkpf INTO ls_bkpf
  UP TO 1 ROWS
  WHERE gjahr = 2018.
ENDSELECT.
IF sy-subrc = 0.
  SET PARAMETER: ID 'BUK' FIELD ls_bkpf-bukrs,
                 ID 'BLN' FIELD ls_bkpf-belnr,
                 ID 'GJR' FIELD ls_bkpf-gjahr.
  CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
ENDIF.

WRITE: / 'back from FB03'.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章