程序的效能优化
說明:本文檔是參照sap程序優(yōu)化標準培訓教材BC490。
程序優(yōu)化宗旨:1.正確運用索引,盡量避免以全表掃描的方式提取數(shù)據(jù),
這是程序效能的最主要影響因素。
2.盡量減少數(shù)據(jù)的傳輸(例如,利用buffer,無用列不要傳,數(shù)據(jù)
的過濾盡量放在數(shù)據(jù)庫層等)。
3.批處理優(yōu)于逐筆處理。
4.讓代碼少作無用功,擯棄無用程序代碼。
一、實現(xiàn)方式的優(yōu)化:
1.檢查系統(tǒng)標準報表,察看有沒有功能相同,相似的報表,以標準報表,或標準報表的增強版代替自定義開發(fā)程序。
2.低效率的query程序,如果問題出在無法優(yōu)化的infoset 則應該考慮abap開發(fā)。
3.通過信息結構產(chǎn)生的查詢程序,要特別注意效能,必要的時候考慮abap自定義開發(fā),或query, report painter 等方式實現(xiàn)。
4.通過邏輯數(shù)據(jù)庫實現(xiàn)的程序,如果效能低,可以考慮abap開發(fā)實現(xiàn)。
二、運行方式的優(yōu)化:
1.對于非實時數(shù)據(jù)查詢報表,可以考慮放到后臺運行。
2.非實時數(shù)據(jù)查詢,可以通過自定數(shù)據(jù)表存儲運算結果,讓用戶直接從自定義表抽取報表數(shù)據(jù),大大提升查詢響應速度。
3.定期后臺運行程序,把結果存入文檔直接讓用戶下載等。
三、查詢界面的優(yōu)化:
1. 注意避免完全無輸入限制的界面,這樣可能會導致全表掃描的查詢方式,帶來效能問題
2.查詢界面的設計要盡量契合程序中SQL的where條件。
四、程序代碼的優(yōu)化:
1) 正確運用索引:For all frequently used Select statements, try to use an
index. You always use an index if you specify (a generic part of)
the index fields concatenated with logical Ands in the Select
statement's Where clause. Note that complex Where clauses
are poison for the statement optimizer in any database system。
如果一個大數(shù)據(jù)量的SQL查詢,WHERE條件沒有利用索引提取數(shù)據(jù),必然帶來嚴重的效能問題:可以通過工具ST05等分析查詢效能,或直接通過觀察法分析SQL查詢語句。
A.首先查看是否使用正確的數(shù)據(jù)表,(例如如果要取得科目期間金額數(shù)據(jù),可直接從glt0表中獲得,而不要通過bseg累加計算了)。
B.如果當前表不能提供按索引查詢,可考慮是否可以通過索引表,例如vbrp中沒有按物料的條件查詢,但vbrmp則有按物料的索引,可以通過該表獲得憑證號,再通過憑證號到VBRP中獲得所需信息。
C.看有沒有符合條件的視圖。
D.按查詢條件建立索引。
*自定義索引請注意以下問題:
1.不要修改標準索引。
2.每個表一般索引個數(shù)不要超過5個,索引字段一般不要超過4個。
3.盡量不要在主數(shù)據(jù)表和業(yè)務數(shù)據(jù)表中添加索引。
4.不要在以DD打頭的標中建索引,因為他們是基礎表。
5.字段排列按一下規(guī)則: Identifiers:+ Organizational units:+ Status fields:+ Classifiers:+ Date and time:+ Text fields:)。
6.對于非常復雜的where條件要拆成多查詢語句,因為數(shù)據(jù)庫的查詢優(yōu)化器無法對復雜條
件查詢實現(xiàn)優(yōu)化,可能導致非索引查詢。
2) Where條件中盡量不要用“非”的查詢條件(諸如not,<>, not in ,etc),這樣可以縮小
數(shù)據(jù)搜索范圍。
3)注意BUFFER:For all frequently used, read-only tables, try to use SAP buffering.
Network load is considerably less。
4) 盡量避免嵌套查詢,多SQL查詢,看可不可以用視圖,表關聯(lián)或子查詢替代。
5) 用Select Into Table 代替Select + Append模式語句。
6) 用批處理模式代替逐紀錄處理,例如:
INSERT CUSTOMERS FROM TABLE TAB.
比下面語句要高效的多
LOOP AT TAB INTO TAB_WA.
INSERT INTO CUSTOMERS VALUES TAB_WA.
ENDLOOP.
其他操作原理相同
7) 把運算盡量放到SQL層次實現(xiàn),避免不必要數(shù)據(jù)的傳輸,例如
SELECT * FROM SBOOK INTO SBOOK_WA
WHERE CARRID = 'LH' AND CONNID = '0400'.
ENDSELECT.
比下面語句要高效率
SELECT * FROM SBOOK INTO SBOOK_WA.
CHECK: SBOOK_WA-CARRID = 'LH' AND SBOOK_WA-CONNID = '0400'.
ENDSELECT.
還有: DATA: MAX_MSGNR type t100-msgnr.
SELECT MAX( MSGNR ) FROM T100 INTO max_msgnr
WHERE SPRSL = 'D' AND
ARBGB = '00'.比下面語句要高效率得多
DATA: MAX_MSGNR type t100-msgnr.
MAX_MSGNR = '000'.
SELECT * FROM T100 INTO T100_WA
WHERE SPRSL = 'D' AND
ARBGB = '00'.
CHECK: T100_WA-MSGNR > MAX_MSGNR.
MAX_MSGNR = T100_WA-MSGNR.
ENDSELECT.
等等,其他操作原理相同。
8)不要濫用 SELECT *,一般應把所需字段list出來,不要list不必要的字段,減少數(shù)據(jù)傳輸,減輕網(wǎng)絡負擔,提升性能。
9)大數(shù)據(jù)量內(nèi)表處理的優(yōu)化
a.批處理優(yōu)于逐紀錄處理,例如APPEND LINES OF ITAB1 TO ITAB2.
優(yōu)于
LOOP AT ITAB1 INTO WA.
APPEND WA TO ITAB2.
ENDLOOP.
ITAB2[] = ITAB1[].
優(yōu)于
REFRESH ITAB2.
LOOP AT ITAB1 INTO WA.
APPEND WA TO ITAB2.
ENDLOOP.
b.運用排序和BINARY SEARCH
If internal tables are assumed to have many (>20) entries, a linear
search through all entries is very time-consuming.
Try to keep the table ordered and use binary search
or used a table of type SORTED TABLE.
If TAB has n entries, linear search runs in O( n ) time, whereas
binary search takes only O( log2( n ) ).
例如:
READ TABLE ITAB INTO WA WITH KEY K = 'X' BINARY SEARCH.
遠優(yōu)于
READ TABLE ITAB INTO WA WITH KEY K = 'X'.
總結
- 上一篇: 不用SE11建Structure传Int
- 下一篇: 关于SMARTFORM的页数问题