ABAP程序性能优化
生活随笔
收集整理的這篇文章主要介紹了
ABAP程序性能优化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
程序效率優化的重點:
降低CPU負載
降低數據庫負載(減少IO操作)
內存使用的優化
減低CPU負載: 1. 使用WHERE條件減少循環次數。 即推薦: LOOP AT itab WHERE vbeln INs_vbeln. ENDLOOP. 不推薦:LOOP AT itab. IF. ENDIF.ENDLOOP.
2. 盡量避免使用MOVE-CORRESPONDING和INTOCORRESPONDING FIELDS OF。 CORRESPONDING語句在系統內部存在隱式操作: 1). 檢查元素名稱匹配; 2). 檢查元素類型匹配; 3). 元素類型轉換;
3. 使用SORTED TABLE 和 HASHED TABLE表類型。 1). SORTED TABLE定義: ??順序表是在計算機內存中以數組的形式保存的線性表,是指用一族地址連續的存儲單元一次存儲數據元素的線性結構。線性表采用順序存儲的方式存儲就稱之為順序表。順序表是將表中的節點依次存放在計算機內存中一組地址連續的存儲單元中。
DATA: it_tab TYPE SORTED TABLE OF ty_tabWITH NON-UNIQUE KEY vbeln.
2). HASHED TABLE定義: ? ?哈希表(也叫散列表)是根據關鍵字值直接進行訪問的數據結構,也就是說,它通過把關鍵字值映射到表中一個位置來訪問記錄,以加快查找的速度,這個映射函數叫做哈希函數,存放記錄的數組叫做哈希表。 DATA: it_tab TYPE SORTED TABLE OF ty_tabWITH UNIQUE KEY vbeln.
4. 使用BINARY SEARCH 二分查找算法。 一般線性查找的缺點就是耗時,而二分查找比線性查找更高效。 時間復雜度由O(n)階降低到 O(log n)階 注意:BINARY SEARCH前必須進行索引按升序排序
5. 使用較高效的 DELETE ADJACENT DUPLICATESFROM 刪除內表鄰近重復記錄。 語法: (SORT<itab> f1 f2) DELETE ADJACENT DUPLICATES FROM<itab> [COMPARING f1 f2...]. 注意:使用前必須進行索引排序
6. 使用較高效的COLLECT語句對記錄進行聚集加總。 注意:COLLECT語句的效率只體現在當你使用的是排序表和哈希表的時候,或者內表經過有效排序之后。否則當內表數據過多時,檢索時間會很長,一般不推薦使用記錄條數非常多的標準表。
降低數據庫負載的技巧: 1. 避免SELECT ...ENDSELECT語句 SELECTENDSELECT語句其實是一個循環體,為了減少循環次數,建議使用一次性TABLE賦值。
2. 避免使用SELECT *. 取而代之的是 SELECT field list INTO[TABLE]...
3. 使用FOR ALL ENTRIES IN語句聯接數據庫表和內表 SELECT FOR ALL ENTRIES IN 取代 LOOP +SELECT.
使用FOR ALL ENTRIES IN 要注意: 1). 檢查driver table是否為空,為空不行 2). 刪除重復條目
使用時機: 1). LOOP + SELECT; 2).簇表是禁止JOIN的表類型,當需要聯接簇表查詢時可以使用; 3). JOIN超過3個表會出現性能問題,當使用JOIN鏈接的表超過3個時。
4.通過創建視圖高速緩存提高查詢效率,在頻繁讀取的時候突顯性能。 注意:視圖所聯接的表不能是事務表,因為事務表用于頻繁寫入,放在視圖里反而增加系統更新視圖內容的負擔。
5. 使用二級索引提高查詢效率. 案例:提高財務憑證段表BSEG查詢效率 SELECT bukrs belnr gjahr INTO TABLEitab1? ? FROM bkpf WHERE bukrsIN p_bukrs AND gjahr IN p_gjahr.
SELECT ... INTO TABLE itab2 FROMbseg ? FOR ALL ENTRIES INitab1 ? WHERE bukrs =itab1-bukrs ? ?AND belnr = itab1-belnr ? ?AND gjahr = itab1-gjahr. 問:二級索引在哪?BSEG有二級索引嗎?
6. 使用索引提高查詢效率. SQL查詢語句的WHERE 條件按照INDEX的順序書寫。
7. 避免使用SQL的ORDERBY語句,SORT語句更高效 ORDER BY PRIMARY KEY: Sort at DB levelwith index ORDER BY: Sort at DB level withoutindex SORT BY: Sort in ABAP, Applicationlevel.
8. 使用SQL 聚合函數MAX, MIN, COUNT, AVG,SUM 聚合函數計算完成在DB level, 程序實現聚合函數功能就是在ABAP中。 問:7和8中為什么結果剛好相反?
9. 使用LDB(邏輯數據庫)比直接查詢表更高效 系統提供了很多LDB: HR模塊:PNP FI模塊:BRF SD模塊:VAV 參考程序:DEMO_LOGICAL_DATABASE
程序內存使用的優化: 1. 使用OCCURS n 與 OCCURS 0的區別
OCCURS n代表初始化內表的空間大小為n,當內表存儲記錄條數超出n時,系統將依靠頁面文件存放超出部分的數據。當系統內存資源十分緊缺的時候,我們可以使用OCCURSn 的初始化方法,但是這樣的效率稍微慢點。
OCCURS 0代表初始化內表的空間大小為無限,當內表存儲記錄條數不斷增加時,內表所使用的內存空間不斷擴大,直到系統無法分配為止。使用內存比使用頁面交換更快一些,但是要考慮系統的資源狀態。
2. 使用SELECT... PACKAGE SIZE n分段查詢數據,減低數據庫緩存負擔 SELECT ... INTO TABLE itab PACKAGE SIZE100 FROM vbak... 該語句實現每次打開DB會話時,往應用服務器上傳輸100條記錄,然后關閉會話,刷新緩存。用于在數據庫緩存資源緊缺的情況下使用。
工具: SE30:運行時間分析 評估:ABAP,數據庫,R/3系統 的執行時間
ST05: 性能分析
轉自:http://wenku.baidu.com/view/9284d710f18583d0496459b1.html?from=rec&pos=3&weight=4&lastweight=4&count=5 與50位技術專家面對面20年技術見證,附贈技術全景圖
減低CPU負載: 1. 使用WHERE條件減少循環次數。 即推薦: LOOP AT itab WHERE vbeln INs_vbeln. ENDLOOP. 不推薦:LOOP AT itab. IF. ENDIF.ENDLOOP.
2. 盡量避免使用MOVE-CORRESPONDING和INTOCORRESPONDING FIELDS OF。 CORRESPONDING語句在系統內部存在隱式操作: 1). 檢查元素名稱匹配; 2). 檢查元素類型匹配; 3). 元素類型轉換;
3. 使用SORTED TABLE 和 HASHED TABLE表類型。 1). SORTED TABLE定義: ??順序表是在計算機內存中以數組的形式保存的線性表,是指用一族地址連續的存儲單元一次存儲數據元素的線性結構。線性表采用順序存儲的方式存儲就稱之為順序表。順序表是將表中的節點依次存放在計算機內存中一組地址連續的存儲單元中。
DATA: it_tab TYPE SORTED TABLE OF ty_tabWITH NON-UNIQUE KEY vbeln.
2). HASHED TABLE定義: ? ?哈希表(也叫散列表)是根據關鍵字值直接進行訪問的數據結構,也就是說,它通過把關鍵字值映射到表中一個位置來訪問記錄,以加快查找的速度,這個映射函數叫做哈希函數,存放記錄的數組叫做哈希表。 DATA: it_tab TYPE SORTED TABLE OF ty_tabWITH UNIQUE KEY vbeln.
4. 使用BINARY SEARCH 二分查找算法。 一般線性查找的缺點就是耗時,而二分查找比線性查找更高效。 時間復雜度由O(n)階降低到 O(log n)階 注意:BINARY SEARCH前必須進行索引按升序排序
5. 使用較高效的 DELETE ADJACENT DUPLICATESFROM 刪除內表鄰近重復記錄。 語法: (SORT<itab> f1 f2) DELETE ADJACENT DUPLICATES FROM<itab> [COMPARING f1 f2...]. 注意:使用前必須進行索引排序
6. 使用較高效的COLLECT語句對記錄進行聚集加總。 注意:COLLECT語句的效率只體現在當你使用的是排序表和哈希表的時候,或者內表經過有效排序之后。否則當內表數據過多時,檢索時間會很長,一般不推薦使用記錄條數非常多的標準表。
降低數據庫負載的技巧: 1. 避免SELECT ...ENDSELECT語句 SELECTENDSELECT語句其實是一個循環體,為了減少循環次數,建議使用一次性TABLE賦值。
2. 避免使用SELECT *. 取而代之的是 SELECT field list INTO[TABLE]...
3. 使用FOR ALL ENTRIES IN語句聯接數據庫表和內表 SELECT FOR ALL ENTRIES IN 取代 LOOP +SELECT.
使用FOR ALL ENTRIES IN 要注意: 1). 檢查driver table是否為空,為空不行 2). 刪除重復條目
使用時機: 1). LOOP + SELECT; 2).簇表是禁止JOIN的表類型,當需要聯接簇表查詢時可以使用; 3). JOIN超過3個表會出現性能問題,當使用JOIN鏈接的表超過3個時。
4.通過創建視圖高速緩存提高查詢效率,在頻繁讀取的時候突顯性能。 注意:視圖所聯接的表不能是事務表,因為事務表用于頻繁寫入,放在視圖里反而增加系統更新視圖內容的負擔。
5. 使用二級索引提高查詢效率. 案例:提高財務憑證段表BSEG查詢效率 SELECT bukrs belnr gjahr INTO TABLEitab1? ? FROM bkpf WHERE bukrsIN p_bukrs AND gjahr IN p_gjahr.
SELECT ... INTO TABLE itab2 FROMbseg ? FOR ALL ENTRIES INitab1 ? WHERE bukrs =itab1-bukrs ? ?AND belnr = itab1-belnr ? ?AND gjahr = itab1-gjahr. 問:二級索引在哪?BSEG有二級索引嗎?
6. 使用索引提高查詢效率. SQL查詢語句的WHERE 條件按照INDEX的順序書寫。
7. 避免使用SQL的ORDERBY語句,SORT語句更高效 ORDER BY PRIMARY KEY: Sort at DB levelwith index ORDER BY: Sort at DB level withoutindex SORT BY: Sort in ABAP, Applicationlevel.
8. 使用SQL 聚合函數MAX, MIN, COUNT, AVG,SUM 聚合函數計算完成在DB level, 程序實現聚合函數功能就是在ABAP中。 問:7和8中為什么結果剛好相反?
9. 使用LDB(邏輯數據庫)比直接查詢表更高效 系統提供了很多LDB: HR模塊:PNP FI模塊:BRF SD模塊:VAV 參考程序:DEMO_LOGICAL_DATABASE
程序內存使用的優化: 1. 使用OCCURS n 與 OCCURS 0的區別
OCCURS n代表初始化內表的空間大小為n,當內表存儲記錄條數超出n時,系統將依靠頁面文件存放超出部分的數據。當系統內存資源十分緊缺的時候,我們可以使用OCCURSn 的初始化方法,但是這樣的效率稍微慢點。
OCCURS 0代表初始化內表的空間大小為無限,當內表存儲記錄條數不斷增加時,內表所使用的內存空間不斷擴大,直到系統無法分配為止。使用內存比使用頁面交換更快一些,但是要考慮系統的資源狀態。
2. 使用SELECT... PACKAGE SIZE n分段查詢數據,減低數據庫緩存負擔 SELECT ... INTO TABLE itab PACKAGE SIZE100 FROM vbak... 該語句實現每次打開DB會話時,往應用服務器上傳輸100條記錄,然后關閉會話,刷新緩存。用于在數據庫緩存資源緊缺的情況下使用。
工具: SE30:運行時間分析 評估:ABAP,數據庫,R/3系統 的執行時間
ST05: 性能分析
轉自:http://wenku.baidu.com/view/9284d710f18583d0496459b1.html?from=rec&pos=3&weight=4&lastweight=4&count=5 與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的ABAP程序性能优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于SAP的预留问题
- 下一篇: 如何调整ABAP程序的性能