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 / 1826 / 0 / 5 ) » 02.03.2005 17:36
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


Beitrag von ereglam (Top Expert / 1826 / 0 / 5 ) » 02.03.2005 17:46
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 ) » 03.03.2005 07:24
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 ) » 03.03.2005 07:29
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


Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und besseren Inhalt:

Aktuelle Forenbeiträge

Ausgabe einer ganzen Work Area?
vor 17 Stunden von ewx 9 / 166

Vergleichbare Themen

MARA und MARC - Unterschied?
von genua » 25.10.2007 18:40
Anzahl Tabelleneinträge
von sandrabudni » 25.10.2006 15:24
Zeitabhängige Tabelleneinträge
von ewx » 07.04.2011 11:08
Tabelleneinträge als Objekte verwalten
von ralf.wenzel » 17.05.2014 09:49