您的位置:首页 > 其它

SAP ABAP程序性能优化

2005-02-02 17:03 549 查看
PerformanceTuning
ContributedbyHenrikFrankForallentriesNestedselectsSelectusingJOINSUsetheselectioncriteriaUsetheaggregatedfunctionsSelectwithviewSelectwithindexsupportSelect…IntotableSelectwithselectionlistKeyaccesstomultiplelinesCopyinginternaltablesModifyingasetoflinesDeletingasequenceoflinesLinearsearchvs.binaryComparisonofinternaltablesModifyselectedcomponentsAppendingtwointernaltablesDeletingasetoflinesToolsavailableinSAPtopin-pointaperformanceproblemOptimizingtheloadofthedatabase

Forallentries

Theforallentriescreatesawhereclause,wherealltheentriesinthedrivertablearecombinedwithOR.Ifthenumberofentriesinthedrivertableislargerthanrsdb/max_blocking_factor,severalsimilarSQLstatementsareexecutedtolimitthelengthoftheWHEREclause.TheplusLargeamountofdata
Mixingprocessingandreadingofdata
Fastinternalreprocessingofdata
FastTheMinusDifficulttoprogram/understand
Memorycouldbecritical(useFREEorPACKAGEsize)SomestepsthatmightmakeFORALLENTRIESmoreefficient:Removingduplicatesfromthedrivertable
Sortingthedrivertable
Ifpossible,convertthedatainthedrivertabletorangessoaBETWEENstatementisusedinsteadofandORstatement:
FORALLENTRIESINi_tab
WHEREmykey>=i_tab-lowand
mykey<=i_tab-high.

Nestedselects

Theplus:Smallamountofdata
Mixingprocessingandreadingofdata
Easytocode-andunderstandTheminus:Largeamountofdata
whenmixedprocessingisn’tneeded
Performancekillerno.1

SelectusingJOINS

TheplusVerylargeamountofdata
SimilartoNestedselects-whentheaccessesareplannedbytheprogrammer
Insomecasesthefastest
NotsomemorycriticalTheminusVerydifficulttoprogram/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.

LOOP
ATTAB1.
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...FORUPDATEIfyouwanttoexplicitlybypassthebuffer,usetheBYPASSBUFFERadditiontotheSELECTclause.

UsetheABAPSORTClauseInsteadofORDERBY

TheORDERBYclauseisexecutedonthedatabaseserverwhiletheABAPSORTstatementisexecutedontheapplicationserver.Thedatabaseserverwillusuallybethebottleneck,sosometimesitisbettertomovethesortfromthedatabaseservertotheapplicationserver.Ifyouarenotsortingbytheprimarykey(E.g.usingtheORDERBYPRIMARYkeystatement)butaresortingbyanotherkey,itcouldbebettertousetheABAPSORTstatementtosortthedatainaninternaltable.Notehoweverthatforverylargeresultsetsitmightnotbeafeasiblesolutionandyouwouldwanttoletthedatabaseserversortit.

AvoidtheSELECTDISTINCTStatement

AswiththeORDERBYclauseitcouldbebettertoavoidusingSELECTDISTINCT,ifsomeofthefieldsarenotpartofanindex.InsteaduseABAPSORT+DELETEADJACENTDUPLICATESonaninternaltable,todeleteduplicaterows.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: