天天看點

SAP ABAP程式優化方法(搜集自論壇)

 關于SQL語句的性能

作者:神話 日期:2005-11-22

字型大小: 小 中 大

DATA: BEGIN OF it_mara OCCURS 0,

matnr LIKE mara-matnr,

maktx LIKE makt-maktx,

END OF it_mara.

第一種寫法:

Select matnr

INTO it_mara

FROM mara.

APPEND it_mara.

ENDSelect.

第二種寫法(high performace):

Select matnr

INTO TABLE it_mara

FROM mara.

==========================================

DATA: BEGIN OF it_mara OCCURS 0,

matnr LIKE mara-matnr,

maktx LIKE makt-maktx,

END OF it_mara.

DATA: BEGIN OF it_makt OCCURS 0,

matnr LIKE mara-matnr,

maktx LIKE makt-maktx,

END OF it_makt.

第一種寫法:

LOOP AT it_mara.

Select SINGLE maktx

INTO it_mara-maktx

FROM makt

Where matnr = it_mara-matnr AND

spras = sy-langu.

MODIFY it_mara TRANSPORTING maktx.

ENDLOOP.

第二種寫法(high performace)

Select matnr maktx

INTO TABLE it_makt

FROM makt

FOR ALL ENTRIES IN it_mara

Where matnr = it_mara-matnr and

spras = sy-langu.

=========================================

1 資料——>工作區,工作區——>内表,

2 資料——>内表

很明顯少了一個過程 效率自然高了 如果資料量越大,效果是可想而知的

=========================================

1 每周遊内表一下 都要select一下 select 本身就是循環 循環套循環 時間消耗度是n*n

2select出已經存在内表中的所有滿足條件的值 不敢說時間消耗度是n*n 但至少時間上大大地打了一下折

***************************************************

http://www.itpub.net/488487,2.html (from itpub 作者:tzhueng)

前一陣子剛好調整了公司自行開發的ABAP,列出一些我的經驗:

1.首先是找出有問題的程式:

一般查詢程式執行時間隻要超過100秒(這是觀察SAP标準程式的效率值)以上這些程式就是要Tune的可以透過T-CODE:SM50 或 T-CODE:SM37 去找資料,分析線上或是背景執行有哪些ABAP 很慢

2.程式效能分析

T-CODE:SE30 程式執行時間分析,找出程式慢的部份,執行完程式可以區分三個階段的執行時間:

ABAP、Database、System,這三個部份對效能的優先級為Database -> System -> ABAP

要依序排除程式這些部份的問題。一般建議上線前Basis 一定要先稽核這個資料是OK才讓該ABAP

上線,否則一上線會拖垮整個主機效能反而更麻煩。

3.Database 效能分析

一般來說自行開發的程式大部份對資料庫的有效率存去都會忽略,這部份可以透過檢查索引、調整程

式文法改善,在SE30分析程式可以看出哪些Table花費的成本最高,針對程式中這些SQL文法進行檢查:

首先要檢查索引,程式中的Where字段在Table index是有滿足,如果沒有Index,就要評估該報表

執行頻率,如果很高就要建一個索引(T-CODE:SE11)給它用,否則就應排背景于非上班時間執行。

可以透過 ST05 去追蹤SQL Performance,如此可以看到程式中SQL使用的,有時Table明明有可以

符合 SQL 使用的Index可是程式還是不依該Index Query Data,這是系統判斷錯誤,這時可以使用

資料庫特有的文法指定Index執行。

Oracle 指定Index 的範例文法為:

SELECT carrid connid cityfrom

FROM spfli INTO (xcarrid, xconnid, xcityfrom)

WHERE carrid = 'LH ' AND cityfrom = 'FRANKFURT'

%_HINTS ORACLE 'INDEX("SPFLI" "SPFLI~001")'.

             ^^^^^ ^^^^^^^^^

             Table Index ID

4.系統資源的控制

當DB的問題處理完成後,就要注意程式對系統資源使用的控制了,ABAP中不能無限制的使用系統記憶體,有些大量耗用記憶體的程式是可以透過程式技巧調整的,還有就是用完了要清。

5.心得:目前大部份自行開發的部份都是上面的問題,調整完後,就很少有ABAP會對主機造成負擔,希望上列的處理步驟可以協助大家。

******************************************************

http://www.itpub.net/showthread.php?s=&threadid=376666

(from itpub 作者:jumpwater)

ABAP開發注意:SELECT-ENDSELECT盡量不要用,至少不要濫用

ABAP中支援一種SELECT-ENDSELECT的結構,就是可以在SELECT中對取得的每一行資料可以先放入一個行結構中,再做處理。

初看似乎覺得蠻有用的,的确這個結構本身就是為了友善處理資料的。但是,如果你濫用了這種結構,那麼會嚴重影響程式性能。

我接觸過的一個報表程式就是用了這種結構,結果系統運作半年後,這張報表就不能用,原因是什麼呢?就是因為資料量大了之後,在SELECT和END SELECT之間做處理的時間會很長,進而導緻資料庫端因為連接配接逾時而斷開。

由此可以判斷,SELECT-END SELECT語句在整個過程中是保持資料庫連接配接的,對資料庫絕對是個負擔。

是以,在大資料量處理的報表中,不能用SELECT-END SELECT這種寫法。

經過調整後,那張報表速度有所提高,至少不會被資料庫踢掉了。

(kingrule)provide/endprovide 是對内表的資料再次進行操作,下面是一個使用的例子:

DATA: BEGIN OF SE OCCURS 3,

FROM TYPE D,

TO TYPE D,

NAME(15) TYPE C,

AGE TYPE I,

END OF SE,

BEGIN OF PR OCCURS 4,

START TYPE D,

END TYPE D,

PRICE TYPE I,

NAME(10) TYPE C,

END OF PR,

BEGIN OF SH OCCURS 2,

CLOSED TYPE D,

STR(20) TYPE C,

OPENED TYPE D,

END OF SH VALID BETWEEN OPENED AND CLOSED,

BEGIN TYPE D VALUE '19910701',

END TYPE D VALUE '19921001'.

SE-FROM = '19910801'. SE-TO = '19910930'.

SE-NAME = 'Shorty'. SE-AGE = 19. APPEND SE.

SE-FROM = '19911005'. SE-TO = '19920315'.

SE-NAME = 'Snowman'. SE-AGE = 35. APPEND SE.

SE-FROM = '19920318'. SE-TO = '19921231'.

SE-NAME = 'Tom'. SE-AGE = 25. APPEND SE.

PR-START = '19910901'. PR-END = '19911130'.

PR-NAME = 'Car'. PR-PRICE = 30000. APPEND PR.

PR-START = '19911201'. PR-END = '19920315'.

PR-NAME = 'Wood'. PR-PRICE = 10. APPEND PR.

PR-START = '19920318'. PR-END = '19920801'.

PR-NAME = 'TV'. PR-PRICE = 1000. APPEND PR.

PR-START = '19920802'. PR-END = '19921031'.

PR-NAME = 'Medal'. PR-PRICE = 5000. APPEND PR.

SH-CLOSED = '19920315'. SH-STR = 'Gold Avenue'.

SH-OPENED = '19910801'. APPEND SH.

SH-CLOSED = '19921031'. SH-STR = 'Wall Street'.

SH-OPENED = '19920318'. APPEND SH.

PROVIDE NAME AGE FROM SE

NAME FROM PR

* FROM SH

BETWEEN BEGIN AND END.

...

ENDPROVIDE.

(jumpwater)樓上的用法偶不知道唉,學習ING

可是似乎你是對内表進行操作麼

(xiamingkang)支援樓上所說,一開始看ABAP文法是就覺得這種做法會影響性能。以下是我的見解,不知對不對:

SELECT - ENDSELECT 其實相當于在一個LOOP中反複查詢,從所周知,在SELECT語句中條件越多查詢性能越差,而且資料量越大,速度越慢,暫不談斷開連結的問題,光是查詢時若資料量在幾百MB或GB數量級,光使用SELECT就要花費大量的時間,背景資料庫SQL2000(本人搞這玩意的),在查詢時就需要耗時,雖然SAP有自己的OPEN SQL,但處理時也必須将OPEN SQL語句轉換成SQL2000認識的語句才能在SQL2000上執行。

是以建議大家在使用時正如 kingrule 所講的,建一内表,先将需要的資料INTO,再進行處理,這樣在大數量級的處理上就有明顯的性能優勢。

(kingrule)SELECT --- ENDSELECT . 這個用法其實是把資料放在一個結構中,然後通過循環使用的。但是使用内表後,那相當于是放在一個緩存中,然後在這個開辟的緩存空間中再次進行循環使用,這樣,就可以減少搜尋資料的時間,當然,要使用内表裡面的資料(我指的是需要使用每一行資料),還是要通過LOOP --- ENDLOOP.來操作的,不過,你可以在LOOP 前,做一個 SORT ITAB BY KEY1的操作,而且在LOOP AT ITAB WHERE 條件,還可以這種用法,真的是很好用的。

SELECT --- ENDSELECT.的方法,是針對透明表進行操作的, PROVIDE ---- ENDPROVIDE.是針對内表進行操作的,這是兩個不同的用法。

(jumpwater)減少對資料庫的操作是ABAP開發需要注意的地方,SAP發明出了内表并且有那麼多操作内表的語句,目的恐怕就是想避免頻繁的資料庫通路吧。

用SE38編輯程式時,可以通過Environment-Examples-Performance Examples看到有很多性能優化的資料,針對常用的語句進行了對比分析,作為ABAPer應該好好看看。

******************************************************

http://www.sapforum.net/viewthread.php?tid=301

(from sap forum 作者:yaopipi)

#1 [求助]有關優化的程式,請各路高手指點阿[這個貼子最後由yaopipi在 2002/07/16 05:35pm 編輯]

除了建視圖、for all entries、join還有什麼好的方法避免使用select嵌套?

#2 [求助]有關優化的程式,請各路高手指點阿

xjqpxd

其實基本上也就是這些方法,主要靠你自己的程式設計思路。或者你可以貼一段代碼,大家幫忙分析分析。

******************************************************

我在itpub發表的關于abap程式優化的文章:

http://www.itpub.net/488487.html