SELECT + LOOP: Geschwindigkeit?

Getting started ... Alles für einen gelungenen Start.
36 Beiträge • Vorherige Seite 2 von 3 (current) Nächste
36 Beiträge Vorherige Seite 2 von 3 (current) Nächste

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von black_adept (Top Expert / 4087 / 126 / 940 ) »
@ M@atze: Den Austausch von INTO durch ASSIGNING hört man ja häufiger um ein Programm zu beschleunigen. (Und ich selber verwende deshalb fast ausschließlich ASSIGNING ).
Jedoch bringt das bei Programmen, die mit der Laufzeit zu kämpfen haben so gut wie gar nix.
Ich habe ein Testprogramm ( wenn das jemand haben möchte PM an mich ) und habe das mit diversen Konstellationen getestet:
Ja - das ASSIGN ist bei mir zwischen Faktor 1,5 und 5 schneller
ABER, bei z.b. 10 Millionen Zeilen über eine Tabelle mit 10 Felder der Breite 10: 0,5 Sekunden ( Faktor 1,8 ) oder bei 100000 Zeilen einer Tabelle mit 100 Feldern der Breite 100: 0,2 Sekunden ( Faktor 4 ). Das sind aber reine LOOPs, die gar nichts innerhalb des LOOPs machen. Normalerweise kommt die Laufzeit aber durch die Aktionen innerhalb des Loops und nicht durch die Art der Zuweisung
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

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


Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von foxtrot (ForumUser / 28 / 1 / 0 ) »
durch nachträgliches editieren mag sich bei den Beiträgen was verschoben/ überschnitten haben...

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von foxtrot (ForumUser / 28 / 1 / 0 ) »
DeathAndPain hat geschrieben:
18.11.2019 13:48
Wenn das durch die Prüfung auf POSNR IS INITIAL repräsentiert wird, dann könntest Du da auch nochmal optimieren und meinen Codevorschlag wie folgt umstellen:

Code: Alles auswählen.

LOOP AT lt_vbpa ASSIGNING FIELD-SYMBOL(<lw_vbpa>) WHERE vbeln = lw_grid_tab-vbeln
                                                    AND posnr = lw_grid_tab-posnr.
  PERFORM whatever_you_wanna_do USING <lw_vbpa>.
ENDLOOP.

IF sy-subrc <> 0.
  LOOP AT lt_vbpa ASSIGNING <lw_vbpa> WHERE vbeln = lw_grid_tab-vbeln
                                        AND posnr = '000000'.
    PERFORM whatever_you_wanna_do USING <lw_vbpa>.
  ENDLOOP.
ENDIF.
Dann würdest Du Dir das Lesen des Kopfpartners sparen, wenn Du Positionspartner findest und hättest damit nochmals Performance rausgemolken.
Dazu hatte ich dann noch was geschrieben, und noch eine Ergänzung: jeder einzelne Partner kann alleine auf der Position vorkommen oder auch nicht. Die Variante, zuerst Kopfpartner durchzuackern und dann ggf. mit Positionspartnern zu überschreiben, ist bei diesen zwei loops die richtigere, bis auf das Problem mit den erwähnten select options.
Du weißt aber, dass es ABAP-Befehle zur Laufzeitmessung gibt? Lies Dir mal die F1-Hilfe von GET RUN TIME durch.
Mein Daumen ist ausreichend genau - ich muss nicht alles ausprogrammieren. Und auch SAT wirft eine Gesamtzeit aus, wenn ich es auf ms genau wissen wollte.
(zugleich kann ich dann eine "Zwischenzeit" ablesen, wenn die Meldung in der Statusleiste wechselt...)

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von foxtrot (ForumUser / 28 / 1 / 0 ) »
foxtrot hat geschrieben:
18.11.2019 14:04
(zugleich kann ich dann eine "Zwischenzeit" ablesen, wenn die Meldung in der Statusleiste wechselt...)
also beim händisch stoppen, nicht in SAT...

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von foxtrot (ForumUser / 28 / 1 / 0 ) »
Test mit field symbols: genau gleich schnell...

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von foxtrot (ForumUser / 28 / 1 / 0 ) »
Jetzt hab ich aus Jux und Tollerei (ungeachtet dessen, dass ich da ein Problem mit Selektion von Partnern habe) noch die Version mit einem großen select vbap und zwei loops ausprobiert (zuerst 000000, dann posnr) und auch diese Version ist etwa gleich schnell wie viele kleine selects oder die read-Version.
Interessant, dass ich bei allen drei Versionen etwa auf die gleiche Laufzeit komme. Scheint das Minimum zu sein.

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von Somani (ForumUser / 81 / 12 / 20 ) »
black_adept hat geschrieben:
18.11.2019 13:52
@ M@atze: Den Austausch von INTO durch ASSIGNING hört man ja häufiger um ein Programm zu beschleunigen. (Und ich selber verwende deshalb fast ausschließlich ASSIGNING ).
Jedoch bringt das bei Programmen, die mit der Laufzeit zu kämpfen haben so gut wie gar nix.
Ich habe ein Testprogramm ( wenn das jemand haben möchte PM an mich ) und habe das mit diversen Konstellationen getestet:
Ja - das ASSIGN ist bei mir zwischen Faktor 1,5 und 5 schneller
ABER, bei z.b. 10 Millionen Zeilen über eine Tabelle mit 10 Felder der Breite 10: 0,5 Sekunden ( Faktor 1,8 ) oder bei 100000 Zeilen einer Tabelle mit 100 Feldern der Breite 100: 0,2 Sekunden ( Faktor 4 ). Das sind aber reine LOOPs, die gar nichts innerhalb des LOOPs machen. Normalerweise kommt die Laufzeit aber durch die Aktionen innerhalb des Loops und nicht durch die Art der Zuweisung
@black_adept
Wie sieht dein Programm aus, wenn du stattdessen REFERENCING INTO nimmst?

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
Über wie viele Datensätze in den internen Tabellen reden wir?

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von foxtrot (ForumUser / 28 / 1 / 0 ) »
ewx hat geschrieben:
18.11.2019 15:57
Über wie viele Datensätze in den internen Tabellen reden wir?
Bei meinem Test im Entwicklungssystem hab ich gut 10.000 Sätze aus dem initialen select, und wenn ich die VBPA vor dem loop lese, sind da gut 14000 Zeilen drin. Das Verhältnis wird im Produktivsystem ähnlich sein, da ist dann nur die Frage, wie groß sie selektieren. Und die Auswertung, die ich hier ablösen will, läuft immer wieder einmal in TSV_TNEW_PAGE_ALLOC_FAILED, weil die Anwender vergessen, ordentlich einzuschränken...

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
Das sind jedenfalls keine Mengen, wo es wegen der Größe der Tabellen Probleme geben dürfte.
Du hast also im grunde nur den SELECT auf VBAK + VBAP und dann innerhalb des LOOP die Zuordnung der Partner?
Wie lange läuft das Programm?

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von foxtrot (ForumUser / 28 / 1 / 0 ) »
ewx hat geschrieben:
18.11.2019 16:21
Das sind jedenfalls keine Mengen, wo es wegen der Größe der Tabellen Probleme geben dürfte.
Noch einmal: die angeführten Mengen sind meine Testdaten. Da krieg ich gerade schon brauchbar messbare Laufzeiten, die ich auch erwähnt habe. Am Produktivsystem reden wir von ganz anderen Selektionen, wie beschrieben. De facto hab ich also ein Laufzeitthema.

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
foxtrot hat geschrieben:
18.11.2019 13:52
So bin ich bei meinen Testdaten auf 13s herunten - mit den vielen selects auf die vier gesuchten Partnerrollen war ich auf 12s...
Schön ist anders...
was erwartest du denn als Laufzeit? Wenn dein Programm mit 14.000 Datensätzen 12 Sek. läuft, finde ich das durchaus in Ordnung...

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von DeathAndPain (Top Expert / 1939 / 257 / 412 ) »
Irgendwas haut da nicht hin. So ein LOOP darf keine so langen Laufzeiten erzeugen. Habt ihr möglicherweise ein sehr stark abgespecktes Entwicklungssystem, so nach dem Motto: Auf dem Entwicklungssystem ist es egal, da arbeitet ja eh fast keiner drauf? Wenn das System z.B. am Hauptspeicherlimit kratzt und schon so ständig swappt, dann könnte ich mir vorstellen, dass es nicht schneller ist als die auf einem vernünftig dimensionierten Server untergebrachte Datenbank.

Auf dem Produktivsystem wird das aber sicherlich nicht so sein. Ich kann Dir nur raten, möglichst viel im Hauptspeicher zu rechnen und die Zahl Deiner SELECTs auf ein Minimum zu beschränken. Bei mir hat das eine drastische Beschleunigung meiner Programme gebracht. Und gerade wenn Du davon sprichst, dass es auf euerm Produktivsystem Datenmengen in ganz anderer Größenordnung gibt, dann skalieren sich diese Effekte entsprechend hoch.

Was Du machen kannst und was ich Dir empfehlen würde, auch wenn es anfangs etwas mehr Tipparbeit für Dich bedeutet, ist, Dich von dem SELECT * zu verabschieden und Dir zu überlegen, welche Spalten aus der VBPA Du tatsächlich benötigst. Deklarier am Anfang Deines Programms einen lokalen Typ mit genau diesen Feldern, dann deklariere Deine lokale Tabelle lt_vbpa über diesen Typ (aber natürlich trotzdem sortiert mit gescheitem Schlüssel). Damit reduzierst Du vermutlich (je nachdem, wie viele der Spalten Du wirklich brauchst) ganz erheblich den Hauptspeicherbedarf, und zugleich wird Dein Code im Debugger für Dich und für andere viel besser verständlich, weil man dann in der internen Tabelle nur Werte sieht, die im Zusammenhang Deines Programms tatsächlich bedeutsam sind, statt lauter irrelevantem Datenmüll.

Was habt ihr überhaupt für eine Datenbank?

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von Somani (ForumUser / 81 / 12 / 20 ) »
Ist denn überhaupt sichergestellt, dass der LOOP das zu grunde liegende Problem ist?
Ich mein auch eine SAT Auswertung muss man erstmal korrekt interpretieren. Wenn da der Bruttoverbrauch drauf ist, aber das Netto von irgendwelchen Sachen kommt die während des Loops ausgeführt werden kann man lange versuchen den Loop ans ich zu verbessern. Das wird das Programm nicht schneller machen.

Re: SELECT + LOOP: Geschwindigkeit?

Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
Ich habe mal ein ähnliches Programm geschrieben:
Es erzeugt eine Menge an Testdaten für VBAK, VBAP und VBPA und zwar so, wie von dir geschildert: Viele Positionen und teilweise Partner auf Pos-Ebene.

Wie lange läuft das bei dir?
Auf unserem System läuft es bei 10.000 VBAK-Sätzen ~1600 Millisekunden.
Die reine Laufzeit ist größer, weil ich den Aufbau der Tabellen nicht berücksichtige, sondern nur den Loop zum Lesen aus den Tabellen.
JHM hat geschrieben:
18.11.2019 09:28
Du ließt im allgemeinen sehr viele Daten (SELECT *), verwendest du alle?
Benötigst du wirklich alle PARVW aus der VBPA?
Datensparsamkeit kommt der Laufzeit immer zu Gute.
Das kann ich bei diesem Beispiel NICHT bestätigen! Die Laufzeit später im Loop ist ähnlich; egal, ob ich nur das Notwendigste an Feldern verwende oder ob ich die gesamte VBAK, VBAP etc nutze!
ALLERDINGS: Unter der Verwendung der vollen Struktur kann ich in unserem Testsystem keine 100.000 VBAK-Datensätze (plus abhängige VBAP und VBPA) erzeugen. Der Speicher reicht nicht. Mit der abgespeckten Version geht das.
UND: Der SELECT ansich sollte natürlich ebenfalls schneller sein, da weniger Daten gelesen und transportiert werden müssen.

Also sinnvoll auf jeden Fall, aber nicht zwingend aus Sicht der Laufzeit.

Code: Alles auswählen.

REPORT.

PARAMETERS p_count TYPE i DEFAULT 10000.

TYPES: BEGIN OF ts_sales_data,
         "key
         vbeln  TYPE vbeln,
         posnr  TYPE posnr,
         "header
         vbtyp  TYPE vbtyp,
         auart  TYPE auart,
         erdat  TYPE sydatum,
         ernam  TYPE syuname,
         "item
         matnr  TYPE matnr,
         arktx  TYPE arktx,
         kwmeng TYPE kwmeng,
         meins  TYPE meins,
         "partner
         ag     TYPE kunnr,
         we     TYPE kunnr,
         rg     TYPE kunnr,
         re     TYPE kunnr,
       END OF ts_sales_data,
       tt_sales_data TYPE SORTED TABLE OF ts_sales_data WITH UNIQUE KEY vbeln posnr.

TYPES: BEGIN OF my_vbak,
         vbeln TYPE vbeln,
         vbtyp TYPE vbtyp,
         auart TYPE auart,
         ernam TYPE syuname,
         erdat TYPE sydatum,
       END OF my_vbak,

       BEGIN OF my_vbap,
         vbeln  TYPE vbeln,
         posnr  TYPE posnr,
         vbtyp  TYPE vbtyp,
         matnr  TYPE matnr,
         arktx  TYPE arktx,
         kwmeng TYPE kwmeng,
         meins  TYPE meins,
       END OF my_vbap,

       BEGIN OF my_vbpa,
         vbeln TYPE vbeln,
         posnr TYPE posnr,
         parvw TYPE parvw,
         kunnr TYPE kunnr,
         lifnr TYPE lifnr,
         adrnr TYPE ad_addrnum,
       END OF my_vbpa,
       my_vbpa_t TYPE SORTED TABLE OF my_vbpa WITH UNIQUE KEY vbeln posnr parvw.

DATA sales_items  TYPE SORTED TABLE OF my_vbap WITH UNIQUE KEY vbeln posnr.
DATA sales_orders TYPE SORTED TABLE OF my_vbak WITH UNIQUE KEY primary_key COMPONENTS vbeln.
DATA sales_partners TYPE SORTED TABLE OF my_vbpa WITH UNIQUE KEY vbeln posnr parvw.


*DATA sales_items  TYPE SORTED TABLE OF vbap WITH UNIQUE KEY vbeln posnr.
*DATA sales_orders TYPE SORTED TABLE OF vbak WITH UNIQUE KEY primary_key COMPONENTS vbeln.
*DATA sales_partners TYPE SORTED TABLE OF vbpa WITH UNIQUE KEY vbeln posnr parvw.
DATA sales_data TYPE tt_sales_data.

START-OF-SELECTION.

  PERFORM init.

  GET RUN TIME FIELD DATA(start).
  PERFORM loop.
  GET RUN TIME FIELD DATA(stopp).

  DATA(diff) = ( stopp - start ) / 1000.

  WRITE: / 'Sales orders:   ', lines( sales_orders ).
  WRITE: / 'Sales items:    ', lines( sales_items ).
  WRITE: / 'Sales partners: ', lines( sales_partners ).
  WRITE: / 'run time:       ', diff, 'millisec'.

FORM loop.

  DATA date TYPE ts_sales_data.
  DATA data TYPE tt_sales_data.

  LOOP AT sales_orders INTO DATA(order).
    LOOP AT sales_items INTO DATA(item)
    WHERE vbeln = order-vbeln.
      date-vbeln = order-vbeln.
      date-vbtyp = order-vbtyp.
      date-auart = order-auart.
      date-ernam = order-ernam.
      date-erdat = order-erdat.

      date-posnr = item-posnr.
      date-matnr = item-matnr.
      date-arktx = item-arktx.
      date-kwmeng = item-kwmeng.
      date-meins = item-meins.

      LOOP AT sales_partners INTO DATA(partner_pos)
      WHERE vbeln = item-vbeln
        AND posnr = item-posnr.
        date-ag = partner_pos-kunnr.
        date-we = partner_pos-kunnr.
        date-re = partner_pos-kunnr.
        date-rg = partner_pos-kunnr.
      ENDLOOP.
      IF sy-subrc > 0.
        LOOP AT sales_partners INTO DATA(partner_head)
        WHERE vbeln = item-vbeln
          AND posnr = '000000'.
          date-ag = partner_head-kunnr.
          date-we = partner_head-kunnr.
          date-re = partner_head-kunnr.
          date-rg = partner_head-kunnr.
        ENDLOOP.
      ENDIF.
      INSERT date INTO TABLE data.
    ENDLOOP.
  ENDLOOP.

ENDFORM.

FORM init.

  DATA sales_order_template TYPE my_vbak.
  DATA sales_item_template TYPE my_vbap.

  DATA(rnd) = cl_abap_random_int=>create(
                seed = 18
                min  = 1
                max  = 50 ).

  DATA(rnd_partner) = cl_abap_random_int=>create(
                seed = 18
                min  = 1
                max  = 3 ).

  SELECT * FROM vbak INTO CORRESPONDING FIELDS OF @sales_order_template UP TO 1 ROWS.
  ENDSELECT.

  SELECT * FROM vbap INTO CORRESPONDING FIELDS OF @sales_item_template UP TO 1 ROWS.
  ENDSELECT.

  DATA count_items TYPE i.

  DO p_count TIMES.
    sales_order_template-vbeln = |{ sy-index ALIGN = RIGHT WIDTH = 10 PAD = '0' }|.
    INSERT sales_order_template INTO TABLE sales_orders.

    INSERT LINES OF VALUE my_vbpa_t(
       vbeln = sales_order_template-vbeln
         ( parvw = 'AG' kunnr = 'AGDUMMY' )
         ( parvw = 'WE' kunnr = 'WEDUMMY' )
         ( parvw = 'RE' kunnr = 'REDUMMY' )
         ( parvw = 'RG' kunnr = 'RGDUMMY' ) ) INTO TABLE sales_partners.

    count_items = rnd->get_next( ).

    DO count_items TIMES.
      sales_item_template-vbeln = sales_order_template-vbeln.
      sales_item_template-posnr = |{ sy-index * 10 ALIGN = RIGHT WIDTH = 6 PAD = '0' }|.
      INSERT sales_item_template INTO TABLE sales_items.


      IF rnd_partner->get_next( ) = 1.
        INSERT LINES OF VALUE my_vbpa_t(
           vbeln = sales_item_template-vbeln
           posnr = sales_item_template-posnr
             ( parvw = 'AG' kunnr = 'AGDUMMYPOS' )
             ( parvw = 'WE' kunnr = 'WEDUMMYPOS' )
             ( parvw = 'RE' kunnr = 'REDUMMYPOS' )
             ( parvw = 'RG' kunnr = 'RGDUMMYPOS' ) ) INTO TABLE sales_partners.

      ENDIF.
    ENDDO.
  ENDDO.

ENDFORM.

Vergleichbare Themen

12
Antw.
1042
Views
Loop Geschwindigkeit erhöhen
von ZF_SAPler » 11.11.2022 07:37 • Verfasst in ABAP® für Anfänger
5
Antw.
1355
Views
Geschwindigkeit Optimieren bei Loop und Zuweisung
von autohandel7 » 15.01.2019 10:24 • Verfasst in ABAP® für Anfänger
4
Antw.
5511
Views
loop inkl. Select
von Spookykid » 03.05.2011 10:19 • Verfasst in ABAP® für Anfänger
3
Antw.
2817
Views
Select im loop alternative
von kaufmann123 » 17.05.2018 10:04 • Verfasst in ABAP® für Anfänger
1
Antw.
5307
Views
Loop mit Select-Options in der Where-Bedingung
von made » 11.11.2005 09:12 • Verfasst in ABAP® für Anfänger

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.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
Gestern von Bright4.5 1 / 511
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2146
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8742