Join nur für bestimmte Tabelleneinträge Beispiel MARA/MARC

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
19 Beiträge • Vorherige Seite 2 von 2 (current)
19 Beiträge Vorherige Seite 2 von 2 (current)

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
das wird wohl eine Grundsatzdiskusion :?
Haubi hat geschrieben:
ereglam hat geschrieben:
Haubi hat geschrieben:Da gilt wieder genau das, was immer gilt, wenn es um Performance geht: It depends... :wink: :D
die MARA im Produktivsystem würde ich auch eher selten komplett in eine interne Tabelle laden wollen. Für so etwas gibt es ja dann noch die OPEN CURSOR... FETCH mit blockweisem Bearbeiten der Ergebnismenge...
...oder den SELECT...PACKAGE-SIZE.
Außerdem kann mir keiner erzählen, dass ein LOOP langsamer sei als ein SELECT. Lediglich unter der Berücksichtigung der Ladezeit der Tabelle dürften kurze Tabellen insgesamt langsamer sein.
Wenn es nur darum geht, eine Tabelle auszulesen und die ausgelesenen Sätze zu verarbeiten (z.B. klassische Listverarbeitung) ist der SELECT...ENDSELECT überlegen.
In jeder anderen Konstellation gewinnt der INTO TABLE.

Gruss,
Haubi
Nach meinem Kenntnisstand, öffnet eine SELECT-ENDSELECT für jeden Schleifendurchlauf eine Verbindung zur Datenbank über den impliziten Cursor. Dazu habe ich mal gehört, dass dies ca. 250ms benötigt.
Wenn ich diese Angaben mal für ein 1000-zeiliges Ergebnis betrachte und unterstelle, dass pro Datensatz im Array-Fetch ca. 20ms benötigt werden, kann ich mir nicht vorstellen, dass eine SELECT-Schleife wirklich performanter sein soll... QED
PS: ob es sinnvoll ist, die Daten on-bloc in den Speicher zu laden, ist eine andere Frage

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
black_adept hat geschrieben:Um nochmal auf das ursprüngliche Posting zurückzukommen. Die Lösung von ereglam mit den Subqueries gefällt mir hier gar nicht, da ja nach einem "unkomplizierten" Lösung gesucht wurde. Und die Fragestellung an sich schreit doch nach einem doppelten Join.

Code: Alles auswählen.

select >felder<
    into corresponding fields of table t_matnr
    from mara join marc as m1 on m1~matnr = mara~matnr
              join marc as m2 on m2~matnr = mara~matnr
    where m1~werks = >werk1<
      and m2~werks = >werk2<.
Und auf dem System das ich hier habe ( mit mäßig gefüllten MARA (70.000) und MARC (200.000 )) ist der "einfache" Join ca. doppelt so schnell wie der Subquery.
:oops:
sollte ich mir mal merken... :roll:

PS: wirklich unkompliziert würde ich auch Deine Lösung nicht nennen, da man hier ein wenig die Theorie zum JOIN kennen muss, um es zu verstehen.

Unkompliziert in Sinne eines 'normalen' Entwicklers ist IMHO nur eine Lösung, die sich im wesentlichen im ABAP abspielt, was aber von Bitfummler bereits explizit ausgeschlossen wurde...

Beitrag von Bitfummler (Specialist / 111 / 4 / 3 ) »
black_adept hat geschrieben:Um nochmal auf das ursprüngliche Posting zurückzukommen. Die Lösung von ereglam mit den Subqueries gefällt mir hier gar nicht, da ja nach einem "unkomplizierten" Lösung gesucht wurde. Und die Fragestellung an sich schreit doch nach einem doppelten Join.

Code: Alles auswählen.

select >felder<
    into corresponding fields of table t_matnr
    from mara join marc as m1 on m1~matnr = mara~matnr
              join marc as m2 on m2~matnr = mara~matnr
    where m1~werks = >werk1<
      and m2~werks = >werk2<.
Und auf dem System das ich hier habe ( mit mäßig gefüllten MARA (70.000) und MARC (200.000 )) ist der "einfache" Join ca. doppelt so schnell wie der Subquery.
hallo all ihr bitfummler,

ich finde diese diskussion absolut klasse!!! :P
ich habe beide statements ausprobiert:

DATA: gt_marc TYPE TABLE OF marc,
gs_marc LIKE LINE OF gt_marc.


* ist nur mit daten aus mara moeglich, da pro werk
* nur eine row ausgegeben wird.
* ERGEBNIS: einsatz pro materialnummer mit den
* werken 0101 und 0105
CLEAR gt_marc[].
SELECT *
INTO CORRESPONDING FIELDS OF TABLE gt_marc
FROM mara JOIN marc AS m1 ON m1~matnr =
mara~matnr
JOIN marc AS m2 ON m2~matnr =
mara~matnr
WHERE m1~werks = '0101'
AND m2~werks = '0105'.

LOOP AT gt_marc INTO gs_marc.
WRITE: / gs_marc-matnr, gs_marc-werks.
ENDLOOP.

BREAK-POINT.

* ERGEBNIS: für alle Materialnummern mit den werken
* 0101 und 0105
* werden ALLE werke selektiert.
* Bedeutet: wenn andere Werke nicht
* verarbeitet werden
* sollen, muessen diese direkt abgefangen
* werden.
CLEAR gt_marc[].
SELECT *
INTO CORRESPONDING FIELDS OF gs_marc
FROM mara
INNER JOIN marc
ON marc~matnr = mara~matnr
WHERE
EXISTS
( SELECT werks FROM marc
WHERE matnr = mara~matnr
AND werks = '0101' )
AND
EXISTS
( SELECT werks FROM marc
WHERE matnr = mara~matnr
AND werks = '0105' ).
CHECK: gs_marc-werks = '0101' OR
gs_marc-werks = '0105'.
WRITE: / gs_marc-matnr, gs_marc-werks.
ENDSELECT.

Wie bereits gesagt: it depend's... :)

Fakt ist: ich hab mal wieder was dazugelernt. :!:

Beitrag von Bitfummler (Specialist / 111 / 4 / 3 ) »
ereglam hat geschrieben:
Bitfummler hat geschrieben:
ereglam hat geschrieben:...ging mir zu Anfang auch so. ...
damit war gemeint:
als ich mir den Code anschaute und im Editor checken ließ, habe ich zu Anfang auch übersehen, dass dieser SELECT ja 3 FROM beinhaltete...

PS:
solche Konstrukte sind bei mir auch eher selten... ;)

Na dann bin ich ja beruhigt. hatte schon an mir gezweifelt. aber ich denke, wenn ein kollege damit zu mir gekommen waere, haette ich das scho bemerkt.
es war wohl doch mal wieder die leitung... :shock:

ich finde es jedenfalls klasse, dass es ein solches forum gibt, durch das man schnell zu unkomplizierten loesungen kommen kann. es ist mit der sap und mit kollegen manchmal nicht so unkompliziert. und vor allen dingen nicht ganz so lustig! :D

Vergleichbare Themen

2
Antw.
11325
Views
MARA und MARC - Unterschied?
von genua » 25.10.2007 18:40 • Verfasst in Material Management & Produktionsplanung
6
Antw.
3778
Views
bestimmte Einträge aus Tabellen-Join
von Patrick1982 » 28.08.2024 13:47 • Verfasst in ABAP® für Anfänger
8
Antw.
8185
Views
Anzahl Tabelleneinträge
von sandrabudni » 25.10.2006 15:24 • Verfasst in ABAP Objects®
20
Antw.
7838
Views
Zeitabhängige Tabelleneinträge
von ewx » 07.04.2011 11:08 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Hilfe zum FB MATERIAL_MAINTAIN_DARK
vor 23 Stunden von black_adept gelöst 8 / 1734
HR-Entgeltnachweis
Gestern von ChrisB 4 / 2290

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Hilfe zum FB MATERIAL_MAINTAIN_DARK
vor 23 Stunden von black_adept gelöst 8 / 1734
HR-Entgeltnachweis
Gestern von ChrisB 4 / 2290

Unbeantwortete Forenbeiträge

Export von Spools in XLSX
vor 4 Tagen von abapamateur 1 / 265
Feldberechnung ME32K
vor einer Woche von ZF_SAPler 1 / 852
MS-Word als Editor
letzen Monat von tekko 1 / 4365