Dauer Selektion

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Alle Fragen rund um Basisthemen
19 Beiträge • Seite 1 von 2 (current) Nächste
19 Beiträge Seite 1 von 2 (current) Nächste

Dauer Selektion

Beitrag von Gast ( / / 0 / 3 ) »
Morgen,

mal eine Frage an die Leute von der Basis:
Kann es sein, dass eine Selektion mit einem Report auf die Tabelle BKPF und BSEG, wo ca 100.000 DS selektiert werden, mehrere Stunden dauert?

Oder ist da was falsch konfiguriert?

Mfg

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


Re: Dauer Selektion

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Anonymous hat geschrieben:Morgen,

mal eine Frage an die Leute von der Basis:
Kann es sein, dass eine Selektion mit einem Report auf die Tabelle BKPF und BSEG, wo ca 100.000 DS selektiert werden, mehrere Stunden dauert?

Oder ist da was falsch konfiguriert?

Mfg
Nein, normal ist das nicht!

Wie sieht denn die Selektion dazu aus?

Re: Dauer Selektion

Beitrag von ralf.wenzel (Top Expert / 3935 / 200 / 281 ) »
Anonymous hat geschrieben:Morgen,

mal eine Frage an die Leute von der Basis:
Kann es sein, dass eine Selektion mit einem Report auf die Tabelle BKPF und BSEG, wo ca 100.000 DS selektiert werden, mehrere Stunden dauert?

Oder ist da was falsch konfiguriert?

Mfg
Falsch konfiguriert wohl nicht, aber deine Datenselektion gilt es zu optimieren. Poste sie doch mal, dann werden wir uns darauf stürzen *g


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von Gast ( / / 0 / 3 ) »
na dann mal viel spass damit 8)
Einschränkung findet über bkpf statt (z.B. nur bestimmte periode, bestimmter buchungszeitraum)
und zu dem beleg dann die bseg zeilen lesen.

brauche 2 interne tabellen, da diese nachher getrennt in dateien weggeschrieben werden.

Code: Alles auswählen.

* Selektion BKPF & BSEG
  SELECT *  FROM bkpf CLIENT SPECIFIED
      INTO CORRESPONDING FIELDS OF wa_bkpf
      WHERE mandt EQ sy-mandt
      AND bukrs EQ sbukrs
      AND gjahr EQ sgjahr
      AND monat EQ smonat
      AND budat IN sbudat.
    APPEND wa_bkpf TO it_bkpf.

    SELECT * FROM bseg CLIENT SPECIFIED
      INTO CORRESPONDING FIELDS OF wa_bseg
        WHERE mandt = sy-mandt
        AND bukrs EQ sbukrs
        AND gjahr EQ sgjahr
        AND belnr EQ wa_bkpf-belnr.
      APPEND wa_bseg TO it_bseg.
      CLEAR wa_bseg.

    ENDSELECT.
    CLEAR wa_bkpf.
  ENDSELECT.


Beitrag von ralf.wenzel (Top Expert / 3935 / 200 / 281 ) »
Es hat sicher niemand was dagegen wenn du zumindest deinen Vornamen nennst, jemand anonymen anzusprechen ist immer etwas "holzig" *g
Anonymous hat geschrieben:na dann mal viel spass damit 8)

Code: Alles auswählen.

* Selektion BKPF & BSEG
  SELECT *  FROM bkpf CLIENT SPECIFIED
      INTO CORRESPONDING FIELDS OF wa_bkpf
      WHERE mandt EQ sy-mandt
      AND bukrs EQ sbukrs
      AND gjahr EQ sgjahr
      AND monat EQ smonat
      AND budat IN sbudat.
    APPEND wa_bkpf TO it_bkpf.

    SELECT * FROM bseg CLIENT SPECIFIED
      INTO CORRESPONDING FIELDS OF wa_bseg
        WHERE mandt = sy-mandt
        AND bukrs EQ sbukrs
        AND gjahr EQ sgjahr
        AND belnr EQ wa_bkpf-belnr.
      APPEND wa_bseg TO it_bseg.
      CLEAR wa_bseg.

    ENDSELECT.
    CLEAR wa_bkpf.
  ENDSELECT.

Also, auf den ersten Blick und ohne gerade viel Zeit zu haben, würde ich sofort die Verschachtelung der zwei selects entfernen.

Meine Standardselektionsmethode ist ein "into table..." bzw. "appending table....", das ist in aller Regel erheblich performanter als das einzelne Wegschreiben per append.

Dann kannst du auch sehen, welcher der beiden selects sovijel Zeit braucht, ich tippe massiv auf BSEG, BKPF ist in aller Regel erheblich performanter anzuzapfen.

Brauchst du unbedingt ALLE Felder von BSEG und BKPF? Das kann ich mir kaum vorstellen. Mach doch mal ne Feldliste der Felder, die du WIRKLICH brauchst und du wirst staunen, wie schnell gerade die BSEG-Selektion wird.

Das mal als zwei erste Tips, schreib bitte mal obs erfolgreich war und die Selektion schnell genug ist. Wenn nicht, müssen wir weiter optimieren.


Ralf *der inzwischen selbstst. Datenschutzbeauftragter ist und nur noch Altkunden mit SAP betreut

Noch zwei Fragen:

Hat es einen besonderen Grund, warum das Schlüsselfeld BELNR nicht in der BKPF-Selektion vorkommt?

Deine Variablenbezeichnungen sind etwas verwirrrend, bei "sbukrs" würde ich vom Namen her auf eine select-option tippen, dann ist EQ aber nicht wirklich logisch. sbukrs ist ein Parameter?
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von Florian ( / / 0 / 3 ) »
Hi,
schonmal danke soweit, muss mir die Sache dann genauer angucken.

die ganzen variablen sbukrs etc sind schon richtig, eingetragen, habs halt nur einfach so benannt egal ob es select options oder paramenter sind.

als nächstes werd ich dann mal nur die felder selektieren, die ich auch brauche.

funktioniert "select into table itab" auch wenn ich denn nur ein paar felder selektiere, also z.B. "selekt mandt, belnr, monat, ... from bkpf into table itab" ?

um als nächsten schritt die passenden belegzeilen zu den selektierten belegen zu bekommen müsste ja dann der innere selekt auf die bbkpf erfolgen.
also ich würde dazu dann über die interne tab aus dem ersten select loopen und mit den belnr daraus dann die selects aus der bseg machen.

danke !!

Beitrag von Dirk (ForumUser / 18 / 0 / 0 ) »
Hallo,

die Selektion des Belegkopf benötigt soviel Zeit, das die Bedingung keinem Indizes entspricht. Außerdem ist die Schachtelung nicht zu empfehlen.

Geschäftsjahr und Monat habe ich aus der BKPF-Bedingung rausgeschmissen. Wenn Du das unbedingt benötigst solltest Du Dir aus den beiden Angaben ein Datumsrange zusammenbasteln und dann damit das Buchungsdatum selektieren.

Ich habe die Selektion mal optimiert. Hier das Beispiel:

Code: Alles auswählen.

* Selektion BKPF & BSEG                                  
  select *  from bkpf                                    
      into corresponding fields of table it_bkpf         
      where bukrs eq sbukrs                              
        and budat in sbudat.                             
                                                         
  if not it_bkpf[] is initial.                           
    select * from bseg                                   
      into corresponding fields of table it_bseg         
      for all entries in it_bkpf                         
    where bukrs eq it_bkpf-bukrs                         
    and gjahr eq it_bkpf-gjahr                           
    and belnr eq it_bkpf-belnr.                          
  endif.                                                 
Sorry, alles auf die Schnelle. Habe leider keine Zeit für mehr Ausführungen.
Gruß,
Dirk

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Mal 'n Vorschlag:

Code: Alles auswählen.

DATA: lt_belnr TYPE TABLE OF belnr_d.

CLEAR: it_bseg[].

SELECT belnr 
       FROM  bkpf
       INTO  TABLE lt_belnr
       PACKAGE-SIZE 500
       WHERE bukrs EQ sbukrs
         AND gjahr EQ sgjahr
         AND monat EQ smonat
         AND budat IN sbudat.
  SELECT *
         FROM  bseg
         APPENDING TABLE it_bseg
         FOR ALL ENTRIES IN lt_belnr
         WHERE bukrs EQ sbukrs
           AND gjahr EQ sgjahr
           AND belnr EQ lt_belnr-table_line. 
ENDSELECT.
Es werden also immer 500 Belegnummern gezogen und mit denen ein Massen-Fetch auf die BSEG gemacht.

Die Selektion auf Mandant bei der BSEG habe ich mal weg gelassen, da auf die BKPF auch nur aus dem aktuellen Mandant gelesen wird.

Wie Ralf schon andeutete: versuch mal, die Feldmenge der BSEG einzuschränken, also statt "*" eine Feldliste anzugeben, das bringt echt viel.

Gruss,
Haubi

/edit: mein Vorredner hat's ja ähnlich gemacht, ein Problem tritt nur bei grossen Datenmengen aus der BKPF auf, daher der PACKAGE-SIZE bei mir.
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von ralf.wenzel (Top Expert / 3935 / 200 / 281 ) »
Florian hat geschrieben:die ganzen variablen sbukrs etc sind schon richtig, eingetragen, habs halt nur einfach so benannt egal ob es select options oder paramenter sind.
Das ist grundsätzlich suboptimal, aus einem Variablennamen sollten die wichtigsten Eigenschaften der Variable hervorgehen. Ist es eine Tabelle? Oder eine Range? oder ein unstrukturiertes Feld? Das sollte man schon am Namen ablesen können -- ansonsten kannst du die Variablen auch "Peter" und "Susi" nennen.

Keine Bevormundung, nur ein Tip von jemandem, der sich über nichtssagende Variablennamen von anderen schon massiv geärgert hat, wenn er deren Programme weiterentwickeln musste.
Florian hat geschrieben:funktioniert "select into table itab" auch wenn ich denn nur ein paar felder selektiere, also z.B. "selekt mandt, belnr, monat, ... from bkpf into table itab" ?
Das funktioniert immer, die Feldliste muss halt genauso aussehen wie die itab, das ist wichtig dabei.

Ich verwende gern "for all entries" -- auch wenn das nicht ganz unumstritten ist, und man aufpassen muss dass die referenzierte Tabelle NICHT leer ist, sonst wird nämlich alles selektiert *g


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
darf ich noch anmerken, dass ein CLIENT SPECIFIED nur benutzt werden sollte, wenn auch mandantenübergreifend selektiert werde soll, was hier aber nicht der Fall ist. (abgesehen davon dass es auch unsinnig wäre)

@Haubi
Florian hat in einem seiner Postings angegeben, dass er die beiden Tabellen noch für spätere Schritte benötigt. Daher ist die Verwendung von PACKAGE-SIZE nur dann zu empfehlen, wenn die nachfolgenden Schritte sich in der Schleife abspielen würden.

@Florian
Beim SELECT gibt es den Zusatz FOR ALL ENTRIES, bei der man sich auf eine interne Tabelle beziehen kann.
Und im SELECT auf die BSEG sollte auf jeden Fall die Belegnummer in der Bedingung verwendet werden.

Code: Alles auswählen.

DATA:
  lt_bkpf TYPE TABLE OF bkpf,
  lt_bseg TYPE TABLE OF bseg.
SELECT <feldliste>
       FROM BKPF 
       INTO CORRESPONDING FIELDS OF TABLE lt_bkpf
       WHERE bukrs EQ p_bukrs "p_bukrs => Parameter
       AND   <bedingungen>.
IF sy-subrc EQ 0. "nur dann hat lt_bkpf einen Inhalt
  SELECT <feldliste>
         FROM BSEG
         INTO CORRESPONDING FIELDS OF TABLE lt_bkpf
         FOR ALL ENTRIES IN lt_bkpf
         WHERE bukrs EQ lt_bkpf-bukrs
         AND   belnr EQ lt_bkpf-belnr
         AND   gjahr EQ lt_bkpf-gjahr.

ENDIF.
Beispiel ohne Anspruch auf Vollständigkeit

Und Ralf's Anmerkung zu nichtssagenden Variablen kann ich mich nur anschließen.

PS:
SELECT-Schleifen verwende ich nur, wenn es absolut keinen anderen Weg gibt... :roll:
PPS:
dieses Posting ist über einen längeren Zeitraum entstanden und enthält somit eventuell Informationen, die Andere bereits gepostet haben...
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
ereglam hat geschrieben: @Haubi
Florian hat in einem seiner Postings angegeben, dass er die beiden Tabellen noch für spätere Schritte benötigt. Daher ist die Verwendung von PACKAGE-SIZE nur dann zu empfehlen, wenn die nachfolgenden Schritte sich in der Schleife abspielen würden.
Wäre ja auch kein Problem. Den SELECT auf die BKPF in eine "temporäre" ITab mit allen Feldern, die benötigt werden. Vor dem ENDSELECT werden dann die Zeilen der temporären ITab mittels "APPEND LINES OF" an die "Nutz-ITab" angehängt. Auf jeden Fall läuft der SELECT auf die BSEG wesentlich schneller, da massenhaft Sätze verarbeitet werden.

Gruss,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von ralf.wenzel (Top Expert / 3935 / 200 / 281 ) »
ereglam hat geschrieben:darf ich noch anmerken, dass ein CLIENT SPECIFIED nur benutzt werden sollte, wenn auch mandantenübergreifend selektiert werde soll, was hier aber nicht der Fall ist. (abgesehen davon dass es auch unsinnig wäre)
Nein, darfst du nicht *lach*

Ok, warn schlechter Scherz....
ereglam hat geschrieben:SELECT-Schleifen verwende ich nur, wenn es absolut keinen anderen Weg gibt...
Gibts das überhaupt? Eigentlich nicht, oder? Welches theoretische Konstrukt würde dazu führen dass man eine SELECT-Schleife verwenden *muss*?


Ralf *der jetzt aber echt los muss *hetz*
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von Olaf P. (ForumUser / 61 / 0 / 0 ) »
Hi,
normale Select-Schleifen sind kein Problem, nur geschachtelte sind es.

In einer Select-Schleife wird in der Datenbank auch nicht Satz für Satz gelesen, sondern immer ein Kontrollblock gefüllt, auf den Appl-Server übertragen und dann Satz für Satz dem Programm bereitgestellt.

Der Einsatz von Select-Schleifen ist eigentlich immer dann gegeben, wenn die selektierte Datenmenge potenziell sehr gross sein kann, so dass ich sie nicht einfach in eine interne Tabelle schieben kann. Dabei kann aber auch Package Size wie bereits erwähnt einen Vorteil bieten.

In der Online-Doku sind die wichtigsten Punkte, die man hinsichtlich Performance beachten sollte, sehr gut beschrieben. Es lohnt sich da mal 'reinzuschauen.

Wichtig finde ich auch den Hinweis auf die Feldauswahl, aus Bequemlichkeit (?) wird leider häufig ein SELECT * verwendet, was sehr viele Auswirkungen hat (weniger Sätze pro Kontrollblock, höherer Speicherbedarf, längere Laufzeit, es muss immer auf die Haupttabelle zugegriffen werden, obwohl vielleicht alle benötigten Daten schon in einem Index sind, etc.).

Gruß, Olaf

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
[quote="ralf.wenzel"]

Gibts das überhaupt? Eigentlich nicht, oder? Welches theoretische Konstrukt würde dazu führen dass man eine SELECT-Schleife verwenden *muss*?
[quote]

Ich liiiiiiiebe theoretische Konstrukte. Bei denen muss man glücklicherweise nicht nach einem Sinn fragen.

Beispiel:
Innerhalb der SELECT-Schleife wird eine asynchrone Task gestartet ( Um den COMMIT innerhalb des SELCECt zu vermeiden ), die Daten in die Tabelle einfügt, über die man grade den Select macht.


live long and prosper
Stefan

Beitrag von Gast ( / / 0 / 3 ) »
black_adept hat geschrieben:
ralf.wenzel hat geschrieben:Beispiel:
Innerhalb der SELECT-Schleife wird eine asynchrone Task gestartet ( Um den COMMIT innerhalb des SELCECt zu vermeiden ), die Daten in die Tabelle einfügt, über die man grade den Select macht.
Der Fall ist immer problematisch.
Das Starten der asynchronen Task bewirkt im aufrufenden Prozess ein DB-commit.
Daher wäre schon mal ein OPEN CURSOR WITH HOLD ..., FETCH ... nötig.

Dann braucht man aber auch keine asynchrone Task mehr, nur um ein DB-commit abzusetzen.
Jedoch hilft der DB-Commit nicht dagegen, dass die Rollback Area volläuft, wenn Du die Tabelle, aus der gelesen wird, änderst.

Vergleichbare Themen

0
Antw.
1033
Views
1
Antw.
981
Views
ALV Dauer Zeilenauswahl
von SAP_ENTWICKLER » 12.12.2017 12:02 • Verfasst in ABAP® Core
4
Antw.
3427
Views
Dauer berechnen
von snooze » 18.04.2005 11:27 • Verfasst in ABAP® Core
4
Antw.
2368
Views
Tabellenprotokollierung DB_LOGGING_OFF->Dauer...
von hfahrian » 19.03.2017 13:27 • Verfasst in ABAP® Core
5
Antw.
548
Views
Dauer eines Besuches ausgeben
von Accetron » 15.12.2021 13:10 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Aktuelle Forenbeiträge

Regex in where
vor 13 Stunden von tar 8 / 316
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1597
Programm anlegen mit Vorlage
vor 2 Tagen von DeathAndPain 2 / 245
IT0024 Qualifikationen CP-ID
vor 2 Tagen von DeathAndPain 2 / 484

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

Regex in where
vor 13 Stunden von tar 8 / 316
Daten an Tabelle binden
Gestern von Bright4.5 3 / 1597
Programm anlegen mit Vorlage
vor 2 Tagen von DeathAndPain 2 / 245
IT0024 Qualifikationen CP-ID
vor 2 Tagen von DeathAndPain 2 / 484

Unbeantwortete Forenbeiträge

BUSOBJEKT zu CMIS PHIO ermitteln
vor 2 Tagen von snooga87 1 / 184
aRFC im OO-Kontext
letzen Monat von ralf.wenzel 1 / 3364
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9916