您的位置:首页 > 其它

SAP ABAP程序性能优化

2009-11-07 14:31 483 查看

Forallentries

Theforallentriescreatesawhereclause,wherealltheentriesinthedrivertablearecombinedwithOR.Ifthenumberofentriesinthedrivertableislargerthanrsdb/max_blocking_factor,severalsimilarSQLstatementsareexecutedtolimitthelengthoftheWHEREclause.

Theplus

Largeamountofdata

Mixingprocessingandreadingofdata

Fastinternalreprocessingofdata

Fast

TheMinus

Difficulttoprogram/understand

Memorycouldbecritical(useFREEorPACKAGEsize)

SomestepsthatmightmakeFORALLENTRIESmoreefficient:

Removingduplicatesfromthedrivertable

Sortingthedrivertable

Ifpossible,convertthedatainthedrivertabletorangessoaBETWEENstatementisusedinsteadofandORstatement:
FORALLENTRIESINi_tab

WHEREmykey>=i_tab-lowandmykey<=i_tab-high.

Nestedselects

Theplus:

Smallamountofdata

Mixingprocessingandreadingofdata

Easytocode-andunderstand

Theminus:

Largeamountofdata

whenmixedprocessingisn’tneeded

Performancekillerno.1

SelectusingJOINS

Theplus

Verylargeamountofdata

SimilartoNestedselects-whentheaccessesareplannedbytheprogrammer

Insomecasesthefastest

Notsomemorycritical

Theminus

Verydifficulttoprogram/understand

Mixingprocessingandreadingofdatanotpossible

Usetheselectioncriteria

SELECT*FROMSBOOK.

CHECK:SBOOK-CARRID='LH'AND

SBOOK-CONNID='0400'.

ENDSELECT.

SELECT*FROMSBOOK

WHERECARRID='LH'AND

CONNID='0400'.

ENDSELECT.

Usetheaggregatedfunctions

C4A='000'.

SELECT*FROMT100

WHERESPRSL='D'AND

ARBGB='00'.

CHECK:T100-MSGNR>C4A.

C4A=T100-MSGNR.

ENDSELECT.


SELECTMAX(MSGNR)FROMT100INTOC4A

WHERESPRSL='D'AND

ARBGB='00'.

Selectwithview

SELECT*FROMDD01L

WHEREDOMNAMELIKE'CHAR%'

ANDAS4LOCAL='A'.

SELECTSINGLE*FROMDD01T

WHEREDOMNAME=DD01L-DOMNAME

ANDAS4LOCAL='A'

ANDAS4VERS=DD01L-AS4VERS

ANDDDLANGUAGE=SY-LANGU.

ENDSELECT.


SELECT*FROMDD01V

WHEREDOMNAMELIKE'CHAR%'

ANDDDLANGUAGE=SY-LANGU.

ENDSELECT.

Selectwithindexsupport

SELECT*FROMT100

WHEREARBGB='00'

ANDMSGNR='999'.

ENDSELECT.


SELECT*FROMT002.

SELECT*FROMT100

WHERESPRSL=T002-SPRAS

ANDARBGB='00'

ANDMSGNR='999'.

ENDSELECT.

ENDSELECT.


Select…Intotable

REFRESHX006.

SELECT*FROMT006INTOX006.

APPENDX006.

ENDSELECT


SELECT*FROMT006INTOTABLEX006.


Selectwithselectionlist

SELECT*FROMDD01L

WHEREDOMNAMELIKE'CHAR%'

ANDAS4LOCAL='A'.

ENDSELECT


SELECTDOMNAMEFROMDD01L

INTODD01L-DOMNAME

WHEREDOMNAMELIKE'CHAR%'

ANDAS4LOCAL='A'.

ENDSELECT

Keyaccesstomultiplelines

LOOPATTAB.

CHECKTAB-K=KVAL.

"...

ENDLOOP.


LOOPATTABWHEREK=KVAL.

"...

ENDLOOP.


Copyinginternaltables

REFRESHTAB_DEST.

LOOPATTAB_SRCINTOTAB_DEST.

APPENDTAB_DEST.

ENDLOOP.


TAB_DEST[]=TAB_SRC[].

Modifyingasetoflines

LOOPATTAB.

IFTAB-FLAGISINITIAL.

TAB-FLAG='X'.

ENDIF.

MODIFYTAB.

ENDLOOP.


TAB-FLAG='X'.

MODIFYTABTRANSPORTINGFLAG

WHEREFLAGISINITIAL.


Deletingasequenceoflines

DO101TIMES.

DELETETAB_DESTINDEX450.

ENDDO.


DELETETAB_DESTFROM450TO550.


Linearsearchvs.binary

READTABLETABWITHKEYK='X'.


READTABLETABWITHKEYK='X'BINARYSEARCH.

Comparisonofinternaltables

DESCRIBETABLE:TAB1LINESL1,

TAB2LINESL2.


IFL1<>L2.

TAB_DIFFERENT='X'.

ELSE.

TAB_DIFFERENT=SPACE.

LOOPATTAB1.

READTABLETAB2INDEXSY-TABIX.

IFTAB1<>TAB2.

TAB_DIFFERENT='X'.EXIT.

ENDIF.

ENDLOOP.

ENDIF.


IFTAB_DIFFERENT=SPACE.

"...

ENDIF.


IFTAB1[]=TAB2[].

"...

ENDIF.

Modifyselectedcomponents

LOOPATTAB.

TAB-DATE=SY-DATUM.

MODIFYTAB.

ENDLOOP.


WA-DATE=SY-DATUM.

LOOPATTAB.

MODIFYTABFROMWATRANSPORTINGDATE.

ENDLOOP.

Appendingtwointernaltables

LOOPATTAB_SRC.

APPENDTAB_SRCTOTAB_DEST.

ENDLOOP


APPENDLINESOFTAB_SRCTOTAB_DEST.

Deletingasetoflines

LOOPATTAB_DESTWHEREK=KVAL.

DELETETAB_DEST.

ENDLOOP


DELETETAB_DESTWHEREK=KVAL.


ToolsavailableinSAPtopin-pointaperformanceproblem

·Theruntimeanalysis(SE30)

·SQLTrace(ST05)

·TipsandTrickstool

·Theperformancedatabase


Optimizingtheloadofthedatabase

Usingtablebuffering

Usingbufferedtablesimprovestheperformanceconsiderably.Notethatinsomecasesastatementcannotbeusedwithabufferedtable,sowhenusingthesestatementsthebufferwillbebypassed.Thesestatementsare:

SelectDISTINCT

ORDERBY/GROUPBY/HAVINGclause

AnyWHEREclausethatcontainsasubqueryorISNULLexpression

JOINs

ASELECT...FORUPDATE

Ifyouwanttoexplicitlybypassthebuffer,usetheBYPASSBUFFERadditiontotheSELECTclause.

UsetheABAPSORTClauseInsteadofORDERBY

TheORDERBYclauseisexecutedonthedatabaseserverwhiletheABAPSORTstatementisexecutedontheapplicationserver.Thedatabaseserverwillusuallybethebottleneck,sosometimesitisbettertomovethesortfromthedatabaseservertotheapplicationserver.

Ifyouarenotsortingbytheprimarykey(E.g.usingtheORDERBYPRIMARYkeystatement)butaresortingbyanotherkey,itcouldbebettertousetheABAPSORTstatementtosortthedatainaninternaltable.Notehoweverthatforverylargeresultsetsitmightnotbeafeasiblesolutionandyouwouldwanttoletthedatabaseserversortit.

AvoidtheSELECTDISTINCTStatement

AswiththeORDERBYclauseitcouldbebettertoavoidusingSELECTDISTINCT,ifsomeofthefieldsarenotpartofanindex.InsteaduseABAPSORT+DELETEADJACENTDUPLICATESonaninternaltable,todeleteduplicaterows.

原文地址http://blog.csdn.net/opparts/archive/2005/02/02/278178.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: