ForallentriesTheforallentriescreatesawhereclause,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.
NestedselectsTheplus:
Smallamountofdata
Mixingprocessingandreadingofdata
Easytocode-andunderstand
Theminus:
Largeamountofdata
whenmixedprocessingisn’tneeded
Performancekillerno.1
SelectusingJOINSTheplus
Verylargeamountofdata
SimilartoNestedselects-whentheaccessesareplannedbytheprogrammer
Insomecasesthefastest
Notsomemorycritical
Theminus
Verydifficulttoprogram/understand
Mixingprocessingandreadingofdatanotpossible
UsetheselectioncriteriaSELECT*FROMSBOOK.
CHECK:SBOOK-CARRID='LH'AND
SBOOK-CONNID='0400'.
ENDSELECT.
SELECT*FROMSBOOK
WHERECARRID='LH'AND
CONNID='0400'.
ENDSELECT.
UsetheaggregatedfunctionsC4A='000'.
SELECT*FROMT100
WHERESPRSL='D'AND
ARBGB='00'.
CHECK:T100-MSGNR>C4A.
C4A=T100-MSGNR.
ENDSELECT.
SELECTMAX(MSGNR)FROMT100INTOC4A
WHERESPRSL='D'AND
ARBGB='00'.
SelectwithviewSELECT*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.
SelectwithindexsupportSELECT*FROMT100
WHEREARBGB='00'
ANDMSGNR='999'.
ENDSELECT.
SELECT*FROMT002.
SELECT*FROMT100
WHERESPRSL=T002-SPRAS
ANDARBGB='00'
ANDMSGNR='999'.
ENDSELECT.
ENDSELECT.
Select…IntotableREFRESHX006.
SELECT*FROMT006INTOX006.
APPENDX006.
ENDSELECT
SELECT*FROMT006INTOTABLEX006.
SelectwithselectionlistSELECT*FROMDD01L
WHEREDOMNAMELIKE'CHAR%'
ANDAS4LOCAL='A'.
ENDSELECT
SELECTDOMNAMEFROMDD01L
INTODD01L-DOMNAME
WHEREDOMNAMELIKE'CHAR%'
ANDAS4LOCAL='A'.
ENDSELECT
KeyaccesstomultiplelinesLOOPATTAB.
CHECKTAB-K=KVAL.
"...
ENDLOOP.
LOOPATTABWHEREK=KVAL.
"...
ENDLOOP.
CopyinginternaltablesREFRESHTAB_DEST.
LOOPATTAB_SRCINTOTAB_DEST.
APPENDTAB_DEST.
ENDLOOP.
TAB_DEST[]=TAB_SRC[].
ModifyingasetoflinesLOOPATTAB.
IFTAB-FLAGISINITIAL.
TAB-FLAG='X'.
ENDIF.
MODIFYTAB.
ENDLOOP.
TAB-FLAG='X'.
MODIFYTABTRANSPORTINGFLAG
WHEREFLAGISINITIAL.
DeletingasequenceoflinesDO101TIMES.
DELETETAB_DESTINDEX450.
ENDDO.
DELETETAB_DESTFROM450TO550.
Linearsearchvs.binaryREADTABLETABWITHKEYK='X'.
READTABLETABWITHKEYK='X'BINARYSEARCH.
ComparisonofinternaltablesDESCRIBETABLE: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.
ModifyselectedcomponentsLOOPATTAB.
TAB-DATE=SY-DATUM.
MODIFYTAB.
ENDLOOP.
WA-DATE=SY-DATUM.
LOOPATTAB.
MODIFYTABFROMWATRANSPORTINGDATE.
ENDLOOP.
AppendingtwointernaltablesLOOPATTAB_SRC.
APPENDTAB_SRCTOTAB_DEST.
ENDLOOP
APPENDLINESOFTAB_SRCTOTAB_DEST.
DeletingasetoflinesLOOPATTAB_DESTWHEREK=KVAL.
DELETETAB_DEST.
ENDLOOP
DELETETAB_DESTWHEREK=KVAL.
ToolsavailableinSAPtopin-pointaperformanceproblem·Theruntimeanalysis(SE30)
·SQLTrace(ST05)
·TipsandTrickstool
·Theperformancedatabase
OptimizingtheloadofthedatabaseUsingtablebufferingUsingbufferedtablesimprovestheperformanceconsiderably.Notethatinsomecasesastatementcannotbeusedwithabufferedtable,sowhenusingthesestatementsthebufferwillbebypassed.Thesestatementsare:
SelectDISTINCT
ORDERBY/GROUPBY/HAVINGclause
AnyWHEREclausethatcontainsasubqueryorISNULLexpression
JOINs
ASELECT...FORUPDATE
Ifyouwanttoexplicitlybypassthebuffer,usetheBYPASSBUFFERadditiontotheSELECTclause.
UsetheABAPSORTClauseInsteadofORDERBYTheORDERBYclauseisexecutedonthedatabaseserverwhiletheABAPSORTstatementisexecutedontheapplicationserver.Thedatabaseserverwillusuallybethebottleneck,sosometimesitisbettertomovethesortfromthedatabaseservertotheapplicationserver.
Ifyouarenotsortingbytheprimarykey(E.g.usingtheORDERBYPRIMARYkeystatement)butaresortingbyanotherkey,itcouldbebettertousetheABAPSORTstatementtosortthedatainaninternaltable.Notehoweverthatforverylargeresultsetsitmightnotbeafeasiblesolutionandyouwouldwanttoletthedatabaseserversortit.
AvoidtheSELECTDISTINCTStatementAswiththeORDERBYclauseitcouldbebettertoavoidusingSELECTDISTINCT,ifsomeofthefieldsarenotpartofanindex.InsteaduseABAPSORT+DELETEADJACENTDUPLICATESonaninternaltable,todeleteduplicaterows.
|