SAP ABAP程序性能优化.docx
《SAP ABAP程序性能优化.docx》由会员分享,可在线阅读,更多相关《SAP ABAP程序性能优化.docx(11页珍藏版)》请在冰豆网上搜索。
SAPABAP程序性能优化
SAPABAP程序性能优化
PerformanceTuning
ContributedbyHenrikFrank
1.Forallentries
2.Nestedselects
3.SelectusingJOINS
4.Usetheselectioncriteria
5.Usetheaggregatedfunctions
6.Selectwithview
7.Selectwithindexsupport
8.Select…Intotable
9.Selectwithselectionlist
10.Keyaccesstomultiplelines
11.Copyinginternaltables
12.Modifyingasetoflines
13.Deletingasequenceoflines
14.Linearsearchvs.binary
15.Comparisonofinternaltables
16.Modifyselectedcomponents
17.Appendingtwointernaltables
18.Deletingasetoflines
19.ToolsavailableinSAPtopin-pointaperformanceproblem
20.Optimizingtheloadofthedatabase
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-lowand
mykey<=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.
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...FORUPDATE
Ifyouwanttoexplicitlybypassthebuffer,usetheBYPASSBUFFERadditiontotheSELECTclause.
UsetheABAPSORTClauseInsteadofORDERBY
TheORDERBYclauseisexecutedonthedatabaseserverwhiletheABAPSORTstatementisexecutedontheapplicationserver.Thedatabaseserverwillusuallybethebottleneck,sosometimesitisbettertomovethesortfromthedatabaseservertotheapplicationserver.
Ifyouarenotsortingbytheprimarykey(E.g.usingtheORDERBYPRIMARYkeystatement)butaresortingbyanotherkey,itcouldbebettertousetheABAPSORTstatementtosortthedatainaninternaltable.Notehoweverthatforverylargeresultsetsitmightnotbeafeasiblesolutionandyouwouldwanttoletthedatabaseserversortit.
AvoidtheSELECTDISTINCTStatement
AswiththeORDERBYclauseitcouldbebettertoavoidusingSELECTDISTINCT,ifsomeofthefieldsarenotpartofanindex.InsteaduseABAPSORT+DELETEADJACENTDUPLICATESonaninternaltable,todeleteduplicaterows.