Code: Alles auswählen.
LOOP AT lt_zes INTO DATA(ls_zes) WHERE reday = gs_bw_minutes-date+6(2) AND ( ztart EQ '0050' OR ztart EQ '0540' ).
CASE ls_zes-ztart.
WHEN '0050'. " productive hours
gs_bw_minutes-proda = ls_zes-anzhl.
gs_bw_minutes-propa = ls_zes-anzhl.
WHEN '0540'. " Net productive hours
gs_bw_minutes-bezpa = ls_zes-anzhl.
gs_bw_minutes-propa = gs_bw_minutes-proda - ls_zes-anzhl.
ENDCASE.
ENDLOOP.Code: Alles auswählen.
*Alt:
LOOP AT lt_zes INTO DATA(ls_zes)
*Neu:
LOOP AT lt_zes ASSIGNING FIELD-SYMBOL(<ls_zes>)
Wenn das möglich wäre, würde ich es machen. Allerdings kann ich es hier nicht steuern.ewx hat geschrieben:Du solltest zusehen, dass du nur die Datensätze liest, du du auch benötigst.
Also in dem Fall nur die mit ZTART = { 0050 | 0540 }
Je weniger Datensätze desto besser.
Du solltest die Datensätze auch in Blöcken lesen (50.000, 100.000, 500.000, ...).
Je größer die Tabelle, desto länger dauern die Operationen.
Letztendlich ist es aber egal, ob du einen LOOP über 35 mio Datensätze machst oder 350 LOOPS über 100.000 Datensätze. Verarbeitet werden müssen sie halt...
Am besten schaust du dir in der Transaktion SAT oder im SQL-Trace ST05 an, wo die meiste Laufzeit liegt. Hier musst du mit der Optimierung anfangen.
Das schau ich mir mal an inwieweit ich hiermit arbeiten kann...ewx hat geschrieben: Eine andere Möglichkeit wäre Parallelverarbeitung.
Danke! Das wird bestimmt auch nochmal ein bisschen was bringen. Danke.Tommy Nightmare hat geschrieben:Hallo SaskuAc,
generell würde ich Feldsymbole im Loop empfehlen, dann muss nicht jedes mal die Struktur ls_zes neu befüllt werden.
Konkret:Code: Alles auswählen.
*Alt: LOOP AT lt_zes INTO DATA(ls_zes) *Neu: LOOP AT lt_zes ASSIGNING FIELD-SYMBOL(<ls_zes>)
Kannst du den Baustein nicht anpassen?SaskuAc hat geschrieben: Wenn das möglich wäre, würde ich es machen. Allerdings kann ich es hier nicht steuern.
Ich bekomme die Daten per FuBa der sich hier nicht eingrenzen lässt.
Auch das Löschen der Datensätze kostet Zeit. Musst du am besten ausprobieren. Optimal wäre es, wie gesagt, die Sätze gar nicht erst zu lesen.SaskuAc hat geschrieben: Meint Ihr, dass es etwas bringen könnte, wenn ich aus der internen Tabelle die Datensätze zuerst lösche, die ich nicht brauche, bevor ich per Loop drüber gehe?
Nein ich kann den nicht anpassen, da dieser einer der zentralsten SAP HR-Zeitwirtschafts Bausteine ist, den es gibt. den Kann ich nunmal auch nicht anpassen. Aber wie schon gesagt, die selektion kann ich nicht weiter eingrenzen. Aber mach dir um den FuBa keine Gedanken, den habe ich mit der Zeileewx hat geschrieben:Kannst du den Baustein nicht anpassen?SaskuAc hat geschrieben: Wenn das möglich wäre, würde ich es machen. Allerdings kann ich es hier nicht steuern.
Ich bekomme die Daten per FuBa der sich hier nicht eingrenzen lässt.
Eine direkte Selektion wäre dann natürlich auch eine Alternative, sofern im Baustein nicht jede Menge "Berechnungen" und "Prüfungen" gemacht werden, die du auch nachprogrammieren müsstest.
Code: Alles auswählen.
IMPORT zes TO lt_zes FROM DATABASE pcl2(b2) ID ls_b2_key.Kurz und knapp, Ja. Im prinzip ist er so simpel. BW ruft halt immer pakete mit 100 Personen ab, Parallel. Aber dennoch kommt dadurch die riesen laufzeit zusammen.ewx hat geschrieben: Ich verstehe auch nicht, dass du den Baustein nicht eingrenzen kannst. Wie machst du denn einen "Monatslauf"? Liest du da auch alle 35 mio. Datensätze und schränkst im Loop ein?
Ist das ein Standard-SAP-Baustein?
Auch das Löschen der Datensätze kostet Zeit. Musst du am besten ausprobieren. Optimal wäre es, wie gesagt, die Sätze gar nicht erst zu lesen.SaskuAc hat geschrieben: Meint Ihr, dass es etwas bringen könnte, wenn ich aus der internen Tabelle die Datensätze zuerst lösche, die ich nicht brauche, bevor ich per Loop drüber gehe?
Ist der Extraktor wirklich so simpel, dass ALLE Datensätze gelesen werden und du über ALLE Datensätze einmal loopst?
Liest du irgendwelche Daten nach?
Code: Alles auswählen.
" alt
loop at itab into data(structure) where field1 = X and field2 = Y.
Endloop.
" umgewandelt
loop at itab into data(structure).
check structure-field1 = X and structure-field2 = Y.
endloop. Macht das Sinn, einen 2. Loop zu bauen? Denkst du dass es wirklich schneller gemacht wird?Dele hat geschrieben:Wenn möglich, dann die Tabelle als sortierte Tabelle (non unique) definieren:
der tag aus "reday" sollte ein Schlüsselfeld (z.B. day) sein und ztart sollte ein Schlüsselfeld sein.
Dann mit zwei Loops mit feldsymbol:
1. Loop: day = gs_bw_minutes-date+6(2) and ztart EQ '0050'
2. Loop: day = gs_bw_minutes-date+6(2) and ztart EQ '0540'
Wenn du im Extremfall immer einen 0050-Satz und einen 0540-Satz abwechselnd hast, dann kann es deutlich schneller werden.SaskuAc hat geschrieben:Macht das Sinn, einen 2. Loop zu bauen? Denkst du dass es wirklich schneller gemacht wird?Dele hat geschrieben:Wenn möglich, dann die Tabelle als sortierte Tabelle (non unique) definieren:
der tag aus "reday" sollte ein Schlüsselfeld (z.B. day) sein und ztart sollte ein Schlüsselfeld sein.
Dann mit zwei Loops mit feldsymbol:
1. Loop: day = gs_bw_minutes-date+6(2) and ztart EQ '0050'
2. Loop: day = gs_bw_minutes-date+6(2) and ztart EQ '0540'
Es hängt davon ab, wie der ABAP-Prozessor mit dem OR umgeht. Wenn er nur den ersten Schlüssel (also day) nimmt, dann werden alle Einträge zum Tag gelesen und die OR-Bedingung dient nur als Filter. Kann aber auch sein, dass der ABAP-Prozessor intelligenter ist.Macht das Sinn, einen 2. Loop zu bauen? Denkst du dass es wirklich schneller gemacht wird?
Wenn du das mal wieder finden solltest, stell es gerne rein. Fände ich sehr interessant.ewx hat geschrieben:Das habe ich gerade gelernt: Stichwort "Branch prediction"
Bin mir nicht sicher, ob das auch (oder gerade) bei Schleifen gilt.
Bei 35 mio. Datensätzen sicherlich relevant: Der Datentransport ist nach wie vor die größte Schwachstelle. Ein moderner Prozessor kann deutlich mehr Daten verarbeiten, als nachgelesen werden kann. Deswegen versucht der Prozessor möglichst viel sinnvolle Daten in seinen Level-1 Cache zu holen. Dafür muss er Annahmen treffen, welche Daten sinnvoll sind. Wenn diese Annahmen aber durch völlig "unszusammenhängende Daten" nicht möglich sind, hat der Prozessor doppelte Arbeit: Er muss die ganzen gelesen Daten wieder verwerfen und neu lesen. Und das dauert. Ich hatte vor Kurzem einen anschaulichen Artikel/ Video dazu gesehen. Finde ich allerdings nicht mehr...
War das nicht einer der Vorträge auf eurem SAP Inside-Track? Dann weißt du auch wo du suchen solltest.ewx hat geschrieben: Das habe ich gerade gelernt: Stichwort "Branch prediction"
Bin mir nicht sicher, ob das auch (oder gerade) bei Schleifen gilt.
[...] Ich hatte vor Kurzem einen anschaulichen Artikel/ Video dazu gesehen. Finde ich allerdings nicht mehr...
Ja, Dmitrii hatte einen ähnlichen Vortrag gehalten, aber ich meinte noch was anderes...black_adept hat geschrieben:War das nicht einer der Vorträge auf eurem SAP Inside-Track? Dann weißt du auch wo du suchen solltest.ewx hat geschrieben: Das habe ich gerade gelernt: Stichwort "Branch prediction"
Bin mir nicht sicher, ob das auch (oder gerade) bei Schleifen gilt.
[...] Ich hatte vor Kurzem einen anschaulichen Artikel/ Video dazu gesehen. Finde ich allerdings nicht mehr...