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 Antworten Schau dir mal den Befehl OPEN CURSOR anann_bine hat geschrieben:@ewx:
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?
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
 Vielen, vielen Dank für alle Vorschläge!
 Vielen, vielen Dank für alle Vorschläge!  