DB-Abfragen/ITab-Handling möglichst performant umsetzen

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

Getting started ... Alles für einen gelungenen Start.
3 Beiträge • Seite 1 von 1
3 Beiträge Seite 1 von 1

DB-Abfragen/ITab-Handling möglichst performant umsetzen

Beitrag von 205er (ForumUser / 4 / 0 / 0 ) »
Hallo zusammen,

ich möchte einen Report zur Auswertung von Daten erstellen. Dabei bin ich jedoch auf ein Problem gestoßen, dass ich mit meinen Kenntnissen nicht so einfach lösen kann. Über Tipps und Anregungen von eurer Seite würde ich mich daher sehr freuen:

Folgendes Szenario ist gegeben:

Ich habe 3 Tabellen, die die benötigten Datensätze enthalten
  • Tabelle A
    mit Schlüssel A1 & A2
  • Tabelle B
    mit den Feldern B1 & B2
  • Tabelle C
    mit Schlüssel C1 & C2
Die Tabellen sind wie folgt miteinander verknüpft:
  • Feld B1 & B2 sind konkateniert in A1 wiederzufinden
  • Feld C1 & C2 sind konkateniert in A2 wiederzufinden
Bild

Ich möchte nun folgende Daten ausgeben:
  • Anzahl der Datensätze in Tabelle A für die gilt, dass A1 = B1B2 UND A2 = C1C2
  • Inhalt Feld B1
  • Inhalt Feld B2
Problemstellung:
Die Tabellen umfassen relativ viele Datensätze (im einstelligen Millionenbereich).
Da die Verknüpfung über die konkatenierten Schlüssel A1 und A2 hergestellt wird, fallen "einfache" SQL-Abfragen weg (oder?). Ich muss die Daten also erst in eine interne Tabelle schreiben und die Felder B1 & B2 sowie C1 & C2 zusammensetzen, um die Aggregatfunktion COUNT auf Tabelle A loszulassen. Problem: wie bringt man zwei interne Tabellen in der WHERE-Klausel unter...
Der Report wird nur sehr selten genutzt, die maximal mögliche Performance muss ich also nicht herausholen. Dennoch würde ich das Programm gern möglichst ressourcenschonend umsetzen.

Leider bin ich kein wirklicher Programmiercrack und sehe daher die (vielleicht) triviale Lösung nicht. Jedenfalls habe ich mir schon stundenlang den Kopf darüber zerbrochen, finde aber keinen befriedigenden Lösungsweg... Ich würde mich daher sehr freuen, wenn ihr mir die ein oder andere Anregung zur Umsetzung geben würdet.

Grüße

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


Re: DB-Abfragen möglichst performant umsetzen

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
hi!

Ich hoffe, ich hab das so richtig verstanden:
Du willst alle Datensätze aus A die sowohl mit A1 in B als auch jene die mit A2 in C vorkommen.

Ich würde hier alle drei Tabellen getrennt und ohne Einschränkung abfragen, aber nur wirklich die Felder selektieren die für den Vergleich benötigt werden.
Also drei interne Tabelle (je eine für A, B und C) die nur zwei Felder beinhalten. (Performance)
Nach der Abfrage von B und C werden alle Datensätze wie benötigt concateniert um den Key von A zu erhalten und das am Besten in derselben Länge wie das jeweilige Feld in A.
Die neuen Schlüssel leigen dann in zwei Tabellen mit flacher Struktur vor. Diese werden dann sortiert und verdichtet damit wirklich nur je ein einmaliger (unique) Datensatz existiert.
Dann werden die Daten aus A in eine interne Tabelle selektiert.
Die Datensätze werden dann in einer LOOP AT abgefragt und per READ TABLE BINARY SEARCH mit den beiden Schlüsseltabellen verglichen.
Ist irgendeiner dieser Vergleiche negativ wird der Datensatz aus A gelöscht.

Am Ende bleiben alle Datensätze aus A übrig die sowohl in B als auch C vorkommen.

Vereinfacht das Ganze als Coding:

Code: Alles auswählen.

SELECT b1 b2 FROM b INTO TABLE lt_b.

LOOP AT lt_b ASSIGNING <ls_b>.
  APPEND INITIAL LINE TO lt_b_key ASSIGNING <ld_b_key>.
  CONCATENATE <ls_b>-b1 <ls_b>-b2 INTO <ld_b_key>.
  DELETE lt_b. "Speicher schonen
ENDLOOP.

SORT lt_b_key.
DELETE ADJACENT DUPLICATES FROM lt_b_key.

SELECT c1 c2 FROM C INTO TABLE lt_c.

LOOP AT lt_c ASSIGNING <ls_c>.
  APPEND INITIAL LINE TO lt_c_key ASSIGNING <ld_c_key>.
  CONCATENATE <ls_c>-c1 <ls_c>-c2 INTO <ld_c_key>.
  DELETE lt_c. "Speicher schonen
ENDLOOP.

SORT lt_c_key.
DELETE ADJACENT DUPLICATES FROM lt_c_key.

SELECT a1 a2 FROM a INTO TABLE lt_a.

LOOP AT lt_a ASSIGNING <ls_a>.
  READ TABLE lt_b_key TRANSPORTING NO FIELDS BINARY SEARCH WITH KEY table_line = <ls_a>-a1.
  IF sy-subrc NE 0.
    DELETE lt_a.
  ELSE.
    READ TABLE lt_c_key TRANSPORTING NO FIELDS BINARY SEARCH WITH KEY table_line = <ls_a>-a2.
    IF sy-subrc NE 0.
      DELETE lt_a.
    ENDIF.
  ENDIF.
ENDLOOP.
lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: DB-Abfragen möglichst performant umsetzen

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
Interessante Aufgabenstellung...!
Du kannst Datensätze folgendermaßen selektieren:

Code: Alles auswählen.

TABLES t005.

PARAMETERS a1 TYPE c LENGTH 2 DEFAULT 'D_'.
PARAMETERS a2 TYPE c LENGTH 2 DEFAULT '_E'.

START-OF-SELECTION.
  SELECT * FROM t005 WHERE land1 LIKE a1 AND land1 LIKE a2.

    WRITE t005-land1.
  ENDSELECT.
Würde für dich bedeuten, du müsstest den Schlüssel A1 (Bsp: 12345678) aufteilen in A1B1 (1234____) und A1B2 (____5678).
und dann ... WHERE B1 LIKE A1B1 and B2... nee sorry.
Du brauchst es ja genau anders herum... Ich lasse es mal stehen.

Also: du kannst mit Teilfeldzugriff arbeiten:

Code: Alles auswählen.

data lt_test type STANDARD TABLE OF char04.

START-OF-SELECTION.
 append '1DE ' to lt_Test.
 append 'XAD ' to lt_Test.

  SELECT * FROM t005t
    into table lt_t005t
     for ALL ENTRIES IN lt_test
   WHERE land1 = lt_Test-table_line+1(3).
Beim Inner Join funktioniert das leider nicht mehr, glaube ich.

Um nicht allzu große Datenmengen zu haben, kannst du mit PACKAGE-SIZE selektieren.

Seite 1 von 1

Vergleichbare Themen

2
Antw.
4407
Views
Sonderzeichen möglichst einfach ausfiltern
von ralf.wenzel » 14.11.2014 20:38 • Verfasst in ABAP® Core
2
Antw.
3800
Views
Sonderzeichen möglichst einfach ausfiltern
von ralf.wenzel » 14.11.2014 20:48 • Verfasst in ABAP® Core
2
Antw.
5595
Views
Arbeitspläne performant lesen
von Bugfix13 » 04.02.2016 14:04 • Verfasst in ABAP® Core
1
Antw.
1218
Views
Zeilenindex in Standardtabelle performant finden
von DeathAndPain » 09.10.2018 15:16 • Verfasst in ABAP® für Anfänger
21
Antw.
9526
Views
SELECT mit Bedinung aus zweiter Tabelle performant gestalten
von Leonidas » 03.05.2012 09:52 • 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

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

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141