解決ABAP獲取大量資料而被佔用過多記憶體等問題
阿新 • • 發佈:2018-12-31
1.最主要的是儘量減少I/O操作,然後是記憶體佔用,在再就是CPU的負載。類似對硬碟的讀寫的I/O操作是最耗費時間的。
如果對記憶體的操作不加以控制,可能有些時候不得不對硬碟的交換空間操作,這樣就增加了對磁碟的I/O讀寫操作。
CPU的負載可以通過優化程式來改善,在程式中儘量使用諸如SUM(SQL語句)或者COLLECT(ABAP語句)。
2.Field-groups對於多層次的排序和顯示是非常有用的。它是將資料寫入系統的頁面檔案,而不是記憶體(內表是使用記憶體的)。
基於這個原因,field-groups比較適合於處理大量資料的列表(一般超過50000條記錄)。如果涉及大量的資料處理,
應該首先和系統管理員協商來決定這個程式最多能使用多少記憶體,以計算這個程式需要使用多少資源。
然後你就可以決定是把資料寫入記憶體還是交換空間。
3.儘可能多地使用表的鍵值作為WHERE分句的條件選項。儘可能讓程式只讀取一定範圍內的記錄
(比如說,你只准備操作一個月之內的業務資料,那麼對於這一個月的業務就應該有一定的範圍取值,如1000~2000。)
4.儘量使用這樣的選擇語句SELECT A B C INTO TABLE ITAB。
5.儘量把更多選擇項放在使用者選擇介面上,以避免程式一次選出大量的資料。
6.用OCCURS NUM_RECS宣告內表,NUM_RECS引數是你估計(或希望)使用到的資料條數。
如果使用到的記錄條數超出NUM_RECS引數的限制,資料將被存放在硬碟上的交換空間(不是記憶體)。
7.儘量使用SELECT A B C INTO TABLE ITAB這樣的語句。這個操作會將所有符合條件的資料一次性地讀進內表,
這比在SELECT A B C INTO ITAB... ENDSELECT的迴圈中新增資料到內表要快。請注意,這裡宣告的內表還應該符合第6條的條件。
8.如果讀出的記錄條數在持續增長,你應該把這些資料分割成幾個固定大小的資料塊。比如說,你想調出一年的資料,
就可以按照月份把一年的資料分成12個月調出。這樣做能減少I/O的操作。
9.學會用效率比較高的COLLECT語句。
10.儘可能使用SELECT SINGLE語句。
11.許多表包括TOTAL欄位(比如GLT0表,包含了各科目按財務期間存放的改期借方和貸方的發生額)。
使用這些表可以省去在程式中計算和值的過程。
如果對記憶體的操作不加以控制,可能有些時候不得不對硬碟的交換空間操作,這樣就增加了對磁碟的I/O讀寫操作。
CPU的負載可以通過優化程式來改善,在程式中儘量使用諸如SUM(SQL語句)或者COLLECT(ABAP語句)。
2.Field-groups對於多層次的排序和顯示是非常有用的。它是將資料寫入系統的頁面檔案,而不是記憶體(內表是使用記憶體的)。
基於這個原因,field-groups比較適合於處理大量資料的列表(一般超過50000條記錄)。如果涉及大量的資料處理,
應該首先和系統管理員協商來決定這個程式最多能使用多少記憶體,以計算這個程式需要使用多少資源。
然後你就可以決定是把資料寫入記憶體還是交換空間。
3.儘可能多地使用表的鍵值作為WHERE分句的條件選項。儘可能讓程式只讀取一定範圍內的記錄
(比如說,你只准備操作一個月之內的業務資料,那麼對於這一個月的業務就應該有一定的範圍取值,如1000~2000。)
4.儘量使用這樣的選擇語句SELECT A B C INTO TABLE ITAB。
5.儘量把更多選擇項放在使用者選擇介面上,以避免程式一次選出大量的資料。
6.用OCCURS NUM_RECS宣告內表,NUM_RECS引數是你估計(或希望)使用到的資料條數。
如果使用到的記錄條數超出NUM_RECS引數的限制,資料將被存放在硬碟上的交換空間(不是記憶體)。
7.儘量使用SELECT A B C INTO TABLE ITAB這樣的語句。這個操作會將所有符合條件的資料一次性地讀進內表,
這比在SELECT A B C INTO ITAB... ENDSELECT的迴圈中新增資料到內表要快。請注意,這裡宣告的內表還應該符合第6條的條件。
8.如果讀出的記錄條數在持續增長,你應該把這些資料分割成幾個固定大小的資料塊。比如說,你想調出一年的資料,
就可以按照月份把一年的資料分成12個月調出。這樣做能減少I/O的操作。
9.學會用效率比較高的COLLECT語句。
10.儘可能使用SELECT SINGLE語句。
11.許多表包括TOTAL欄位(比如GLT0表,包含了各科目按財務期間存放的改期借方和貸方的發生額)。
使用這些表可以省去在程式中計算和值的過程。