ABAP
Performance Standards
By
Tejaswini
Following
are the performance standards need to be following in writing ABAP programs:
1. Unused/Dead code
Avoid leaving unused code in the program. Either comment out or
delete the unused situation. Use program --> check --> extended program
to check for the variables, which are not used statically.
2. Subroutine Usage
For good modularization, the decision of whether or not to execute
a subroutine should be made before the subroutine is called. For example:
This is better:
IF f1 NE 0.
IF f1 NE 0.
PERFORM sub1.
ENDIF.
FORM sub1.
...
ENDFORM.
...
ENDFORM.
Than this:
PERFORM sub1.
FORM sub1.
IF f1 NE 0.
...
ENDIF.
IF f1 NE 0.
...
ENDIF.
ENDFORM.
3. Usage of IF statements
When coding IF tests, nest the testing conditions so that the
outer conditions are those which are most likely to fail. For logical
expressions with AND , place the mostly likely false first and for the OR,
place the mostly likely true first.
Example - nested IF's:
IF (least likely to be true).
IF (less likely to be true).
IF (most likely to be true).
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
Example - IF...ELSEIF...ENDIF :
IF (most likely to be true).
ELSEIF (less likely to be true).
ELSEIF (least likely to be true).
ENDIF.
Example - AND:
IF (least likely to be true) AND
(most likely to be true).
(most likely to be true).
ENDIF.
Example - OR:
IF (most likely to be
true) OR
(least likely to be true).
(least likely to be true).
4. CASE vs. nested Ifs
When
testing fields "equal to" something, one can use either the nested IF
or the CASE statement. The CASE is better for two reasons. It is easier to read
and after about five nested IFs the performance of the CASE is more efficient.
5. MOVE statements
When
records a and b have the exact same structure, it is more efficient to MOVE a
TO b than to MOVE-CORRESPONDING a TO b.
MOVE BSEG TO *BSEG.
is better than
MOVE-CORRESPONDING BSEG TO *BSEG.
6. SELECT and SELECT SINGLE
When
using the SELECT statement, study the key and always provide as much of the
left-most part of the key as possible. If the entire key can be qualified, code
a SELECT SINGLE not just a SELECT. If you are only interested in
the first row or there is only one row to be returned, using SELECT SINGLE can
increase performance by up to three times.
7. Small internal tables vs. complete internal tables
In general it is better to minimize the number of fields declared in an internal table. While it may be convenient to declare an internal table using the LIKE command, in most cases, programs will not use all fields in the SAP standard table.
For
example:
Instead
of this:
data:
t_mara like mara occurs 0 with header line.
Use
this:
data:
begin of t_mara occurs 0,
matnr like mara-matnr,
...
end of t_mara.
...
end of t_mara.
8. Row-level processing and SELECT SINGLE
Similar
to the processing of a SELECT-ENDSELECT loop, when calling multiple
SELECT-SINGLE commands on a non-buffered table (check Data Dictionary ->
Technical Info), you should do the following to improve performance:
o Use the SELECT into <itab> to buffer the
necessary rows in an internal table, then
o sort the rows by the key fields, then
o use a READ TABLE WITH KEY ... BINARY SEARCH in
place of the SELECT SINGLE command. Note that this only make sense when the
table you are buffering is not too large (this decision must be made on a case
by case basis).
9. READing single records of internal tables
When
reading a single record in an internal table, the READ TABLE WITH KEY is not a
direct READ. This means that if the data is not sorted according to the
key, the system must sequentially read the table. Therefore, you
should:
o SORT the table
o use READ TABLE WITH KEY BINARY SEARCH for better
performance.
10. SORTing internal tables
When
SORTing internal tables, specify the fields to SORTed.
SORT
ITAB BY FLD1 FLD2.
is
more efficient than
SORT
ITAB.
11. Number of entries in an
internal table
To
find out how many entries are in an internal table use DESCRIBE.
DESCRIBE
TABLE ITAB LINES CNTLNS.
is
more efficient than
LOOP
AT ITAB.
CNTLNS = CNTLNS + 1.
ENDLOOP.
12. Performance diagnosis
To
diagnose performance problems, it is recommended to use the SAP transaction
SE30, ABAP/4 Runtime Analysis. The utility allows statistical analysis of
transactions and programs.
13. Nested SELECTs versus
table views
Since
releASE 4.0, OPEN SQL allows both inner and outer table joins. A nested
SELECT loop may be used to accomplish the same concept. However, the
performance of nested SELECT loops is very poor in comparison to a join.
Hence, to improve performance by a factor of 25x and reduce network load, you
should either create a view in the data dictionary then use this view to select
data, or code the select using a join.
14. If nested SELECTs must
be used
As
mentioned previously, performance can be dramatically improved by using views
instead of nested SELECTs, however, if this is not possible, then the following
example of using an internal table in a nested SELECT can also improve performance
by a factor of 5x:
Use
this:
form select_good.
form select_good.
data: t_vbak like vbak occurs 0 with header line.
data: t_vbap like vbap occurs 0 with header line.
data: t_vbap like vbap occurs 0 with header line.
select * from vbak into table t_vbak up to 200 rows.
select * from vbap
for all entries in t_vbak
where vbeln = t_vbak-vbeln.
...
endselect.
select * from vbap
for all entries in t_vbak
where vbeln = t_vbak-vbeln.
...
endselect.
endform.
Instead
of this:
form select_bad.
form select_bad.
select
* from vbak up to 200 rows.
select * from vbap where vbeln = vbak-vbeln.
...
endselect.
...
endselect.
endselect.
endform.
Although
using "SELECT...FOR ALL ENTRIES IN..." is generally very fast, you
should be aware of the three pitfalls of using it:
Firstly,
SAP automatically removes any duplicates from the rest of the retrieved
records. Therefore, if you wish to ensure that no qualifying records are
discarded, the field list of the inner SELECT must be designed to ensure the
retrieved records will contain no duplicates (normally, this would mean
including in the list of retrieved fields all of those fields that comprise
that table's primary key).
Secondly,
if you were able to code "SELECT ... FROM <database table> FOR ALL
ENTRIES IN TABLE <itab>" and the internal table <itab> is
empty, then all rows from <database table> will be retrieved.
Thirdly,
if the internal table supplying the selection criteria (i.e. internal table
<itab> in the example "...FOR ALL ENTRIES IN TABLE <itab>
") contains a large number of entries, performance degradation may
occur.
15. SELECT * versus
SELECTing individual fields
In
general, use a SELECT statement specifying a list of fields instead of a SELECT
* to reduce network traffic and improve performance. For tables with only
a few fields the improvements may be minor, but many SAP tables contain more
than 50 fields when the program needs only a few. In the latter case, the
performace gains can be substantial. For example:
Use:
select
vbeln auart vbtyp from table vbak
into (vbak-vbeln, vbak-auart, vbak-vbtyp)
where ...
Instead
of using:
select
* from vbak where ...
16. Avoid unnecessary
statements
There
are a few cases where one command is better than two. For example:
Use:
append
<tab_wa> to <tab>.
Instead
of:
<tab>
= <tab_wa>.
append
<tab> (modify <tab>).
And
also, use:
if
not <tab>[] is initial.
Instead
of:
describe
table <tab> lines <line_counter>.
if
<line_counter> > 0.
17. Copying or appending
internal tables
Use
this:
<tab2>[]
= <tab1>[]. (if <tab2> is empty)
Instead
of this:
loop
at <tab1>.
append <tab1> to <tab2>.
endloop.
However,
if <tab2> is not empty and should not be overwritten, then use:
append
lines of <tab1> [from index1] [to index2] to <tab2>.
0 comments:
Post a Comment