Geschachtelte Loops vermeiden

Ein beim Programmieren oftmals auftretender Fall: Geschachtelte Loops, sprich Loop innerhalb eines Loops oder auch gern nested loops genannt.

Bsp.: Tabelle A: taba (500 Einträge), Tabelle B: tabb (1000 Einträge). Beide vom Typ Standard Table.

Code:
...
loop at taba.
loop at tabb where key1 = taba-field1 and key2 = taba-field2.
*  do whatever           
endloop.
endloop.
...

Die obige Vorgehensweise ist aus Performance-Sicht schlecht, da um die notwendigen Einträge in Tabelle B zu finden, ein sog. Full Table-Scan notwendig ist, d.h es werden 500 * 1000 Durchläufe notwendig, in Summe also 500.000 (!)

Eine erste Optimierung wäre, die Tabellen zu sortieren nach deren Schlüsselfeldern und eine READ-Anweisung mit Zusatz BINARY SEARCH zu verwenden:

Code:
...
LOOP AT taba into ls_taba.
READ TABLE tabb into tabbline WITH KEY field1 = ls_taba-field1                      BINARY SEARCH TRANSPORTING field1.
IF sy-subrc eq 0.
l_tabix = sy-tabix.
LOOP AT tabb INTO ls_tabb FROM l_tabix.             
IF ls_tabb-field1 NE tabbline-field1.
EXIT.
Endif.
ENDLOOP.
ENDIF.
ENDLOOP.
...

Durch die Ermittlung des Index des relevanten Bereichs in Tabelle tabb und der Abbruchbedingung, wird eine Verbesserung erreicht.

Eine weitere Optimierung wäre, statt einer Standard oder HashedTable eine SortedTable zu verwenden. Wenn man eine Sorted Table verwendet und in der WHERE-Bedingung den kompletten Schlüssel angibt, findet eine automatische Optimierung statt, d.h. man kann das Coding des ersten Beispiels verwenden.

Noch keine Bewertungen

Benutzeranmeldung

Navigation

Umfrage

Wie findet ihr das neue Design von ABAPforum.com:

Neueste Kommentare

ABAPforum.com Statistik

Startseite Beiträge insgesamt: 51363
Themen insgesamt: 13200
Mitglieder Mitglieder insgesamt: 8320
Unser neuestes Mitglied: Lieberwirth

Wer ist online

Zur Zeit sind 0 Benutzer und 3 Gäste online.