Code: Alles auswählen.
SELECT
zzbuchid
zzzusid_lang
zzvsnr
zznamvn
zzbuchtext1
zzbuchtext2
zz_provartabr
zzgsfnr
zzgsfnr2
zzgsfnr3
zzfitransdat
zzbuchdat
zzfaellig
gpart
due_conamnt
FROM zicmww_docse UP TO p_maxl ROWS INTO CORRESPONDING FIELDS OF TABLE gt_docse
WHERE
( zzgsfnr IN s_gsfnr OR
zzgsfnr2 IN s_gsfnr OR
zzgsfnr3 IN s_gsfnr ) AND
zzbuchid IN s_anr AND
zzvsnr IN s_vsnr AND
zzfitransdat IN s_fitra AND
zzmig = space.
* Wenn keine DOCSE-Einträge vorhanden, Abbruch, um FullTableScan der VVSCPOS zu verhindern (wg. FOR ALL ENTRIES)
IF gt_docse IS INITIAL.
MESSAGE i018(zcdi1n_reports).
LEAVE TO TRANSACTION 'ZICM_DOCSE'.
ELSE.
* Lese VVSCPOS...
*...gemäß Selektionskriterien
*...nur HVORG gemäß Rangestabelle -> zcdi1n_hvorg_sel (doppelte Datensätze verhindern)
*...für alle in gt_docse enthaltenen GSFNR
* ...Ein Join über die Tabellen nicht möglich, wegen: Geschäftsfallnummer steht
* - je nach HVORG - im Feld zzgsfnr, zzgsfnr2 oder zzgsfnr3
SELECT zz_vtwegabr
zz_provart
h_hkont
zz_remunabr
gsfnr
FROM vvscpos UP TO p_maxl ROWS INTO CORRESPONDING FIELDS OF TABLE gt_vvscpos
FOR ALL ENTRIES IN gt_docse
WHERE hvorg IN gt_hvorg_sel AND
( gsfnr = gt_docse-zzgsfnr OR
gsfnr = gt_docse-zzgsfnr2 OR
gsfnr = gt_docse-zzgsfnr3 ) AND
gsfnr IN s_gsfnr AND "nur GSFNRn gemäß Selektionskriterien
h_hkont IN s_hkont AND
zz_remunabr IN s_remun.
ENDIF.
müssen die Daten denn unbedingt in einem Join gelesen werden? Du könntest drei SELECTS auf jeweils eins der Schlüsselfelder absetzen. Über die Transaktion ST05 könnte man einen SQL-Trace anlegen, prüfen auf welche Art auf die Tabelle zugegriffen wird und ggf. den Tabellen noch zur Unterstützung einen Index verpassenann_bine hat geschrieben:Das Problem hierbei ist, dass das Verbindungsfeld der beiden Tabellen in beiden Tabellen kein Schlüsselfeld ist und in einer der beiden Tabellen kann der Wert in drei verschiedenen Feldern stehen/ vorkommen.
Schau dir mal den Befehl OPEN CURSOR anann_bine hat geschrieben:@ewx:
wie geht das mit dem Zusatz Package-sizes genau? Muss ich dafür nicht eine Select-Schleife machen und dann jedes Package direkt verarbeiten?
Ich denke hier wäre ein INNER JOIN angebrachter. Tab A <-> Tab B (On Feld 1) / Tab A <-> Tab B (On Feld 2) / Tab A <-> Tab B (On Feld 3) und dann alle drei Ergebnisse im Programm zusammenführen.ann_bine hat geschrieben: @Alexander
das mit den 3 Joins hintereinander habe ich schon probiert - das ist leider daran gescheitert, dass in der where-Bedingung beim Left-Outer-Join nur Felder einer Tabelle (ob es die linke oder rechte ist, weiß ich jetzt nicht mehr) vorkommen dürfen. Ich habe aber Einschränkungen auf beide Tabellen.
Hier gibt die Hilfe einige wichtige Infos:ann_bine hat geschrieben: Der Select auf Tabelle A läuft schnell. Nur wenn ich dort ca. 5000 Treffer aufwärts habe und dann mit FOR ALL ENTRIES aus Tabelle B selektieren will, gibt es einen Laufzeitfehler. Die Zugriffe scheinen sich so zu potenzieren, dass es das System nicht packt.
Der Zusatz ist auch beim SELECT verfügbar. F1 sollte ausreichend Hilfe bieten.a-dead-trousers hat geschrieben:Ich Übernehm einfach mal das AntwortenSchau dir mal den Befehl OPEN CURSOR anann_bine hat geschrieben:@ewx:
wie geht das mit dem Zusatz Package-sizes genau? Muss ich dafür nicht eine Select-Schleife machen und dann jedes Package direkt verarbeiten?
lg ADT
Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
Pinguincommander
ewx hat geschrieben:Der Zusatz ist auch beim SELECT verfügbar. F1 sollte ausreichend Hilfe bieten.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Pinguincommander
Folgende Benutzer bedankten sich beim Autor ann_bine für den Beitrag:
Pinguincommander
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Pinguincommander
Die Aussage stimmt so nicht ganz, es kommt ein wenig darauf an, wie man FOR ALL ENTRIE verwendet bzw. die Treibertabelle füllt.ann_bine hat geschrieben:Jetzt habe ich gelesen, das FOR ALL ENTRIES ab 1000 Einträge in der Treibertabelle keine gute Performance mehr hat. Heißt das, ich muss den Anwender zwingen, die Selektion so weit einzugrenzen, dass in der Treibertabelle nicht mehr als 1000 Einträge stehen?
Code: Alles auswählen.
WHERE hvorg IN gt_hvorg_sel AND
( gsfnr = gt_docse-zzgsfnr OR
gsfnr = gt_docse-zzgsfnr2 OR
gsfnr = gt_docse-zzgsfnr3 )
Bei kleineren Tabellen mag das funktionieren, bei der AufgabePinguincommander hat geschrieben: ich habe mir die benötigten tabellen komplett gezogen also SELECT * FROM <DB>
wird es aber bestimmt performanter gehen als 2X SELECT 30 Mio * FROM <DB> mit anschliessendem LOOP darüberich will zwei Tabellen (mit jeweils ca.30 Mio Einträgen) joinen
Nunja wie gesagt, hat mir das ein Kollege gesagt, der hat in seiner vorherigen Firma nur mit Maßenverarbeitung von Daten zu tun gehabt, der hat mir diese möglichkeit empfohlen, welche sich meiner meinung nach auch anbietet, da kein schlüssel vorhanden ist, wenn man dann aber die tabelle sortiert und einen Binary search darüber legt, dürfte dass sehr viel performanz herausholen, ich selbst habe auch nicht gedacht, dass es so Performanter ist, aber bevor man ohne schlüssel eine DB abfragt ist es wesentlich schneller.Alexander D. hat geschrieben: wird es aber bestimmt performanter gehen als 2X SELECT 30 Mio * FROM <DB> mit anschliessendem LOOP darüber