Performance of Sorted Internal Table
Performance of Sorted table is much higher than normal table. The following technique proves that using a simple thing can raise the performance much better.
TYPES: BEGIN OF ty_mara,
matnr LIKE mara-matnr,
mtart LIKE mara-mtart,
END OF ty_mara.
DATA: t_mara1 TYPE SORTED TABLE OF ty_mara
WITH NON-UNIQUE KEY mtart.
DATA: w_counter TYPE i,
w_tabix LIKE sy-tabix.
SELECT matnr, " Material Number
mtart " Material Type
FROM mara
INTO TABLE @DATA(t_mara).
SORT t_mara BY mtart.
t_mara1 = t_mara.
* CASE 1: Processing internal table using LOOP..WHERE Condition
GET RUN TIME FIELD DATA(w_runtime1).
LOOP AT t_mara ASSIGNING FIELD-SYMBOL(<w_mara>)
WHERE mtart EQ 'ZROH'.
ADD 1 TO w_counter.
ENDLOOP.
GET RUN TIME FIELD DATA(w_runtime2).
* Calculate Runtime
w_runtime2 = w_runtime2 - w_runtime1.
WRITE:/ w_runtime2, 'for Records', w_counter.
CLEAR w_counter.
* CASE 2: Using a Sorted table
GET RUN TIME FIELD w_runtime1.
LOOP AT t_mara1 ASSIGNING <w_mara> WHERE mtart EQ 'ZROH'.
ADD 1 TO w_counter.
ENDLOOP.
GET RUN TIME FIELD w_runtime2.
* Calculate Runtime
w_runtime2 = w_runtime2 - w_runtime1.
WRITE:/ w_runtime2, 'for Records', w_counter.
CLEAR w_counter.
* CASE 3: Using INDEX on a sorted table
GET RUN TIME FIELD w_runtime1.
READ TABLE t_mara1 ASSIGNING <w_mara> WITH KEY mtart = 'ZROH'.
IF sy-subrc EQ 0.
w_tabix = sy-tabix + 1.
ADD 1 TO w_counter.
LOOP AT t_mara1 ASSIGNING <w_mara> FROM w_tabix.
IF <w_mara>-mtart NE 'ZROH'.
EXIT.
ENDIF.
ADD 1 TO w_counter.
ENDLOOP.
ENDIF.
GET RUN TIME FIELD w_runtime2.
* Calculate Runtime
w_runtime2 = w_runtime2 - w_runtime1.
WRITE:/ w_runtime2, 'for Records', w_counter.
Different output at different time.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1w6kK-qEaH6iD45FuIUELfB_9y6e_5yzdof4mOWQwTvfoLC5AqatFqN1-Av6gfW1ycHBrqe0avPvTNlwUJRSCZcZel5Bxt9d_6ooOYjoHfQkQJ_kI-0ug2UNCnCnMOt8ob6DfWBGoLg0/s1600/1.JPG)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5bZRYcapDDnXyk0pM4_VNHCt38BMnKoC5Ysa23HIyz3EkIgsym_PC4R4IBaG9cjnKW9aAn2nfPHoV3GKGFkOp3Fn4pY122ivRUqO_c2_EIIIYk3msu5Lk2K1rMM25-ndLUG9w4ODrWYQ/s1600/2.JPG)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjAwS5HedEwaFJZfJcUIG37bgzgu57qNFKnu_pYygIc-0jpJTuX30KgByT0mgPe7HwyZgCZQUh8EGGMInfeR3nS8BrEHgMyUufBy2KBsg-s4ZcmJl44N7p_8VUZ-5ZB1VWtHJaK5ZKVYEM/s1600/3.JPG)
It's very clear that the high performance can be achieved by using this simple technique.
TYPES: BEGIN OF ty_mara,
matnr LIKE mara-matnr,
mtart LIKE mara-mtart,
END OF ty_mara.
DATA: t_mara1 TYPE SORTED TABLE OF ty_mara
WITH NON-UNIQUE KEY mtart.
DATA: w_counter TYPE i,
w_tabix LIKE sy-tabix.
SELECT matnr, " Material Number
mtart " Material Type
FROM mara
INTO TABLE @DATA(t_mara).
SORT t_mara BY mtart.
t_mara1 = t_mara.
* CASE 1: Processing internal table using LOOP..WHERE Condition
GET RUN TIME FIELD DATA(w_runtime1).
LOOP AT t_mara ASSIGNING FIELD-SYMBOL(<w_mara>)
WHERE mtart EQ 'ZROH'.
ADD 1 TO w_counter.
ENDLOOP.
GET RUN TIME FIELD DATA(w_runtime2).
* Calculate Runtime
w_runtime2 = w_runtime2 - w_runtime1.
WRITE:/ w_runtime2, 'for Records', w_counter.
CLEAR w_counter.
* CASE 2: Using a Sorted table
GET RUN TIME FIELD w_runtime1.
LOOP AT t_mara1 ASSIGNING <w_mara> WHERE mtart EQ 'ZROH'.
ADD 1 TO w_counter.
ENDLOOP.
GET RUN TIME FIELD w_runtime2.
* Calculate Runtime
w_runtime2 = w_runtime2 - w_runtime1.
WRITE:/ w_runtime2, 'for Records', w_counter.
CLEAR w_counter.
* CASE 3: Using INDEX on a sorted table
GET RUN TIME FIELD w_runtime1.
READ TABLE t_mara1 ASSIGNING <w_mara> WITH KEY mtart = 'ZROH'.
IF sy-subrc EQ 0.
w_tabix = sy-tabix + 1.
ADD 1 TO w_counter.
LOOP AT t_mara1 ASSIGNING <w_mara> FROM w_tabix.
IF <w_mara>-mtart NE 'ZROH'.
EXIT.
ENDIF.
ADD 1 TO w_counter.
ENDLOOP.
ENDIF.
GET RUN TIME FIELD w_runtime2.
* Calculate Runtime
w_runtime2 = w_runtime2 - w_runtime1.
WRITE:/ w_runtime2, 'for Records', w_counter.
Different output at different time.
It's very clear that the high performance can be achieved by using this simple technique.