a-dead-trousers hat geschrieben: ↑11.11.2022 07:48Wenn der LOOP mit z.B. WHERE eine Einschränkung hat, könnte man diese mit einem (Sekundär-)Schlüssel beschleunigen. Alternativ lassen sich auch mit dem "neuen" GROUP BY auch die nachfolgenden READ TABLE reduzieren, wenn man so mehrere gleiche Aufrufe bündeln kann. Last but not least lässt sich auch der READ TABLE mit einem Schlüsselzugriff (hashed oder sorted table) oder BINARY SEARCH (vorsortierte standard table) noch optimieren.
Was man auf keinen Fall machen sollte, ist innerhalb eines (großen) LOOP mit SELECT (SINGLE) Daten von der Datenbank nachzulesen.
Hat man nicht eine verschachelte LOOP mit LOOP AT GROUP im inneren eines LOOPs?a-dead-trousers hat geschrieben: ↑11.11.2022 07:58Auch mit GROUP BY kann man alle Zeilen ändern. Es geht darum den Zugriff auf die Subtabelle(n) zu optimeren. Sprich wenn z.B. 10 Zeilen in der Haupttabelle existieren, die mit dem selben Schlüssel in der Subtabelle vorkommen, muss man so nur einmal auf diese zugreifen. Die zehn Zeilen der Haupttabelle werden im inneren LOOP AT GROUP mit demselben Ergebnis aus der Abfrage der Subtabelle befüllt.
Code: Alles auswählen.
LOOP AT lt_table ASSIGNING FIELD-SYMBOL(<ls_line>)
GROUP BY ( field = <ls_line>-field ) ASSIGNING FIELD-SYMBOL(<ls_line_group>).
READ TABLE lt_subtable ASSIGNING FIELD-SYMBOL(<ls_subline>)
WITH KEY field = <ls_line_group>-field.
IF sy-subrc EQ 0.
LOOP AT GROUP <ls_line_group> ASSIGNING FIELD-SYMBOL(<ls_line_member>)
<ls_line_member>-data = <ls_subline>-data.
ENDLOOP.
ENDIF.
ENDLOOP.
Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
a-dead-trousers
a-dead-trousers hat geschrieben: ↑12.11.2022 12:37Wenn die Daten von der DB oder anderen "langsamen" Quellen stammen und man das von (Standard-)Funktionsbausteinen nicht besser geregelt bekommt, hilft nur alles selber (vor-)selektieren und dann im Loop nur mehr mit READ TABLE nachlesen (auf keinen Fall SELECT SINGLE).
Alternativ, wenn alles von der DB kommt, kann man sich auch mit einem entsprechend umfangreichen SELECT-Statement oder (CDS-)View die Daten direkt, so wie man sie braucht, in einem Rutsch holen. Dann muss man sich erst gar nicht mit einem (inperformanten) LOOP herumschlagen.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
ZF_SAPler
Danke, ist der VALUE Operator effizienter?a-dead-trousers hat geschrieben: ↑12.11.2022 16:011. VALUE FOR ist eher mit einem LOOP zu vergleichen als einem READ TABLE
2. Jein. ABAP SQL wird in die SQL Syntax der Datenbank übersetzt genauso wie das SQL von CDS. Welches jetzt "besser" auf der Datenbank perfomed kann man so nicht pauschal beantworten. Was bei CDS Views aber besser ist, ist der etwas größere Befehlsumfang. Man kann damit um einiges mehr machen als in klassischen ABAP DDIC Views und etwas mehr als in einem ABAP Select-Statement.
3. Auch hier Jein. Wenn sich die Tabelle im Programmlauf des öfteren verändert, kann die Verwendung von sorted oder hashed sogar etwas Performance kosten, weil die Einfügeoperationen dadurch langsamer werden. Ich persönlich verwende lieber standard tables und wenn ich doch mal einen schnellen Zugriff brauche, behelfe ich mir mit einem (wohldosierten) SORT und dann BINARY SEARCH.
Das UNIQUE hat eigentlich keine Auswirkung auf die Performance. Es gibt nur an ob Schlüsselwerte mehrfach vorkommen dürfen oder nicht.