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:
- Zugriff per READ mit ASSIGNING
- Zugriff per Table Expression, jede Komponente einzeln
- Zugriff per Table Expression auf ganze Zeile mit ASSIGN an Feldsymbol.
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.