Feldleisten verwenden und SELECT INTO TABLE

Der Datentransport zwischen der Datenbank und dem ABAP-Programm ist eine kritische Größe. Deswegen sollte die zu transportierende Datenmenge möglichst klein sein und möglichst selten stattfinden.

Versuchen Sie deswegen möglichst eine Struktur zu verwenden, die nur die von Ihnen benötigten Daten aus der oder den Tabellen enthält.

Es ist zum Beispiel ein großer Unterschied, ob sie alle Felder der VBAP einlesen (Strukturbreite > 1300 Bytes!!) oder nur die benötigten.

Verwenden Sie zur Selektion den Befehl SELECT INTO TABLE. Hierdurch wird die Ergebnismenge mit einem Schlag in die interne Tabelle transportiert. Das spart Zeit!

Probieren Sie es am besten selbst einmal aus…

 Das folgende Beispiel zeigt zum Beispiel die folgenden Werte an:

Laufzeit mehrere Selects: 47.690.833
Laufzeit Inner Join:       1.771.508

Der Speicherverbrauch lag bei diesem Beispiel nur für die Tabelle T_VBAP bei  35.600.000 Bytes. Die kleiner Tabelle T_ITAB dagegen kommt mit 820.000 Bytes aus! Die anderen Tabellen verbrauchen natürlich auch noch Speicherplatz (T_VBAK: 6.100.000 Bytes, T_VBUP: 1.500.000 Bytes).

Die Funktion SELECT INTO TABLE hat noch einen weiteren nicht zu unterschätzenden Vorteil: Sie können die Programmlogik im Debugging ungestört nachvollziehen. In einer SELECT-ENDSELECT-Schleife bricht der Debugger ab dem zweiten Satz mit dem Kurzdump „Unzulässige Unterbrechung einer Datenbankselektion“ ab!

Beispielprogramm

REPORT zzdemo_laufzeit1.

DATA:
*– Variablen für die Zeitmessung
  start TYPE i,
  stopp TYPE i,
  diff TYPE i,

*– Interne Tabellen für Select
  t_vbak LIKE vbak OCCURS 0 WITH HEADER LINE,
  t_vbap LIKE vbap OCCURS 0 WITH HEADER LINE,
  t_vbup LIKE vbup OCCURS 0 WITH HEADER LINE,

*– Interne Tabelle für Inner Join
  BEGIN OF t_itab OCCURS 0,
    vbeln TYPE vbeln,
    posnr TYPE posnr,
    auart TYPE auart,
    ntgew TYPE ntgew,
    gewei TYPE gewei,
    lfsta TYPE lfsta,
  END OF t_itab.

*– Auswahl: Vertriebsbelegnummer
SELECT-OPTIONS: s_vbeln FOR t_itab-vbeln.


START-OF-SELECTION.

  GET RUN TIME FIELD start.
*– Select über Auftragskopf VBAK
  SELECT * FROM vbak INTO t_vbak WHERE vbeln IN s_vbeln.
*– Select über Auftragsposition VBAP
    SELECT * FROM vbap INTO t_vbap WHERE vbeln = t_vbak-vbeln. 
*– Select über den Positionsstatus
      SELECT SINGLE * FROM vbup INTO t_vbup 
       WHERE vbeln = t_vbap-vbeln 
         AND posnr = t_vbap-posnr. 
      APPEND t_vbup. 
      APPEND t_vbap. 
    ENDSELECT. 
    APPEND t_vbak. 
  ENDSELECT.

*– Zeit stoppen
  GET RUN TIME FIELD stopp. 
  diff = stopp – start.
  WRITE: / ‚Laufzeit mehrere Selects:‘, diff.

*– Erneute Messung für Inner Join
  GET RUN TIME FIELD start.

*– Inner Join mit Feldleiste
  SELECT vbak~vbeln 
         vbap~posnr 
         vbak~auart
         vbap~ntgew
         vbap~gewei
         vbup~lfsta
    FROM vbak INNER JOIN vbap ON vbak~vbeln = vbap~vbeln
              INNER JOIN vbup ON vbup~vbeln = vbap~vbeln
                             AND vbup~posnr = vbap~posnr
    INTO TABLE t_itab 
   WHERE vbak~vbeln IN s_vbeln.

*– Zeit stoppen
  GET RUN TIME FIELD stopp.
  diff = stopp – start.
  WRITE: / ‚Laufzeit Inner Join:‘, diff.

Enno Wulff
follow me