ABAP 740 Table Expressions Performance

Die Performance beim Datenzugriff per Table Expression entspricht dem Zugriff per READ Statement. Werden jedoch mehrere Komponenten einer Zeile benötigt und erfolgt der Zugriff auf jede Komponente einzeln, so erhöht sich die Laufzeit etwa um den Faktor [Anzahl angeforderter Komponenten]. Werden drei Komponenten einzeln gelesen, verdreifacht sich die Laufzeit.

Beispiel

Im Beispielreport wird die Laufzeit verschiedener Zugriffsarten verglichen. Pro Datensatz werden zwei Felder geändert. Es werden 10.000 Datensätze verarbeitet. Folgende Zugriffsarten werden verglichen:

  1. Zugriff per READ mit ASSIGNING
  2. Zugriff per Table Expression, jede Komponente einzeln
  3. Zugriff per Table Expression auf ganze Zeile mit ASSIGN an Feldsymbol.
Table Expressions Laufzeitvergleich
Table Expressions Laufzeitvergleich

Da im zweiten Beispiel der Zugriff auf einzelne Komponenten (2 Felder) des Datensatzes erfolgt, beträgt die Laufzeit etwa Faktor 2 im Vergleich zum Zugriff per READ.

Dies erklärt sich damit, dass pro Komponente ein eigener READ Zugriff auf die Tabelle erfolgt.

Der schnellste Zugriff erfolgt mit der Verwendung von Table Expressions und Feldsymbolen (Beispiel 3). Dies kommt daher, da keine Prüfung auf erfolgreiches Auslesen notwendig ist (kein IF SY-SUBRC = 0 und kein IF <fs> IS ASSIGNED notwendig).

Report

 
 *&---------------------------------------------------------------------*
 *& Report  Z_TEST_TABLE_EXPRESSIONS
 *&
 *&---------------------------------------------------------------------*
 *& Performance Test des neuen ABAP Konstrukts Table Expressions
 *&
 *&---------------------------------------------------------------------*
 
 REPORT z_test_table_expressions.
 
 
 TYPES: BEGIN OF ty_data,
          name  TYPE char20,
          ort01 TYPE ort01,
          count TYPE i,
        END OF ty_data.
 
 TYPES tyt_data TYPE STANDARD TABLE OF ty_data.
 
 DATA: lt_data        TYPE tyt_data,
       lv_sta_time    TYPE timestampl,
       lv_end_time    TYPE timestampl,
       lv_diff_old    TYPE p DECIMALS 5,
       lv_diff_new    TYPE p DECIMALS 5,
       lv_diff_new_fs TYPE p DECIMALS 5,
       lv_save        TYPE p DECIMALS 5.
 
 
 FIELD-SYMBOLS :  TYPE ty_data.
 
 " Prepare data
 DO 10000 TIMES.
   APPEND INITIAL LINE TO lt_data ASSIGNING .
   -count = sy-index.
 ENDDO.
 
 
 " Modify old way with field-symbols
 GET TIME STAMP FIELD lv_sta_time.
 
 DO 10000 TIMES.
   READ TABLE lt_data ASSIGNING  WITH KEY count = sy-index.
   IF sy-subrc = 0.
     -name = 'Name_' && sy-index.
     -ort01 = 'Ort_' && sy-index.
   ENDIF.
 ENDDO.
 
 GET TIME STAMP FIELD lv_end_time.
 lv_diff_old = lv_end_time - lv_sta_time.
 
 
 " Modify new way with table expressions
 TRY.
     GET TIME STAMP FIELD lv_sta_time.
 
     DO 10000 TIMES.
       lt_data[ count = sy-index ]-name = 'Name_' && sy-index.
       lt_data[ count = sy-index ]-ort01 = 'Ort_' && sy-index. " Doppelter Zugriff auf den gleichen Datensatz
     ENDDO.
 
     GET TIME STAMP FIELD lv_end_time.
     lv_diff_new = lv_end_time - lv_sta_time.
 
   CATCH cx_sy_itab_line_not_found.
 ENDTRY.
 
 " Modify new way table expressions and field-symbols
 TRY.
     GET TIME STAMP FIELD lv_sta_time.
 
     DO 10000 TIMES.
       ASSIGN lt_data[ count = sy-index ] TO .
       -name = 'Name_' && sy-index.
       -ort01 = 'Ort_' && sy-index.
     ENDDO.
 
     GET TIME STAMP FIELD lv_end_time.
     lv_diff_new_fs = lv_end_time - lv_sta_time.
 
   CATCH cx_sy_itab_line_not_found.
 ENDTRY.
 
 " Output difference
 WRITE: /(45) 'Access type',
          50 'Time',
          70 'Difference to old way'.
 ULINE.
 WRITE: /(45) 'Update with field-symbol (old way)',
          50  lv_diff_old.
 
 lv_save = lv_diff_old - lv_diff_new.
 WRITE: /(45) 'Update with table expression',
          50  lv_diff_new,
          70  lv_save.
 
 lv_save = lv_diff_old - lv_diff_new_fs.
 WRITE: /(45) 'Update with table expr. using field-symbol',
          50  lv_diff_new_fs,
          70  lv_save.