INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

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

Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von tm987456 (ForumUser / 72 / 42 / 14 ) »
Hi zusammen

Interessante Diskussion. Habe das Programm von D&P aufs Wesentliche reduziert und SAT-fähig gemacht.

Gruss
tm

REPORT.

PARAMETERS entries TYPE i OBLIGATORY DEFAULT 1000000.

CLASS lcl_report DEFINITION.

PUBLIC SECTION.

CLASS-METHODS main.

PRIVATE SECTION.

CLASS-DATA:
standard_table TYPE STANDARD TABLE OF i,
sorted_table TYPE SORTED TABLE OF i WITH UNIQUE DEFAULT KEY,
hashed_table TYPE HASHED TABLE OF i WITH UNIQUE DEFAULT KEY.

CLASS-METHODS:
create_standard_table,
create_sorted_table,
create_hashed_table,
search_standard_table,
search_sorted_table,
search_hashed_table.

ENDCLASS.

CLASS lcl_report IMPLEMENTATION.

METHOD main.

create_standard_table( ).
create_sorted_table( ).
create_hashed_table( ).

search_standard_table( ).
search_sorted_table( ).
search_hashed_table( ).

ENDMETHOD.

METHOD create_standard_table.
standard_table = VALUE #( FOR i = 1 UNTIL i > entries ( i ) ).
ENDMETHOD.

METHOD create_sorted_table.
sorted_table = VALUE #( FOR i = 1 UNTIL i > entries ( i ) ).
ENDMETHOD.

METHOD create_hashed_table.
hashed_table = VALUE #( FOR i = 1 UNTIL i > entries ( i ) ).
ENDMETHOD.

METHOD search_standard_table.
DATA(row) = standard_table[ table_line = entries ].
ENDMETHOD.

METHOD search_sorted_table.
DATA(row) = sorted_table[ table_line = entries ].
ENDMETHOD.

METHOD search_hashed_table.
DATA(row) = hashed_table[ table_line = entries ].
ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

lcl_report=>main( ).

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


Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von Bright4.5 (Specialist / 265 / 21 / 1 ) »
Achso, ja zum Zählen von den Schleifendurchläufen... aber klar ich könnte mir auch ne Variable bauen. Die Meinung hier zwecks Performance zu Hashtabellen ist ja aber nicht eindeutig. Ich hab mich da jetzt gestern mal ne bisschen eingelesen. Andere Frage, ich messe gerade die Zeit von meinem Select mit get run time field. Wenn ich es einmal ausführe und dann das SAP-System schließe wieder aufmache, sollte das Ergebnis nicht verfälscht werden(wird es sowieso wegen der Auslastung usw.), da es davor noch im Cache ist, oder? Weil das kommt mir irgendwie so vor....

Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
Also ich habe eher User-Cases, wo ich richtige Tabellen lesen und verarbeiten muss. Und da ist mein Beispiel deutlich überlegen.
Aber trotzdem Danke für dein Quellcode. Das zeigt mir, dass Tabellen mit weniger komplexen Daten schneller sortiert verarbeitet werden können.

Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Bright4.5 hat geschrieben:Achso, ja zum Zählen von den Schleifendurchläufen...
Sorry, aber ich muss weiter fragen wie ein Kindergartenkind: Wozu brauchst Du das?

Wie gesagt, wenn Schleifendurchläufe in irgendeiner Form ein Thema für Dich sind, dann hast Du einen Anwendungsfall, für den hashed tables nicht passen.
nickname8 hat geschrieben:Also ich habe eher User-Cases, wo ich richtige Tabellen lesen und verarbeiten muss. Und da ist mein Beispiel deutlich überlegen.
Aber trotzdem Danke für dein Quellcode. Das zeigt mir, dass Tabellen mit weniger komplexen Daten schneller sortiert verarbeitet werden können.
Das war die Frage. Es hätte auch sein können, dass es an der Art der Zeileneinfügung (einzeln vs en bloc) liegt. Das wäre mir sogar wahrscheinlicher vorgekommen, als dass die Zahl der sortierungsirrelevanten Nichtschlüsselfelder, die da noch hinten dranhängen, einen Unterschied bei der Befüllungsgeschwindigkeit zwischen sorted und hashed macht, denn dafür gibt es keine plausible Begründung (außer einem schlampig programmierten Kernel). Gleichwohl scheint es aber so zu sein, wie ich mich mit einer angepassten Version meines Testprogramms überzeugt habe. Sehr merkwürdig.

Die Frage ist, wo der Break-Even liegt bzw. wieviel weitere Faktoren mit eingehen. Wenn man die internen Tabellen auf T_KEY beschränkt (also über T_KEY statt DD03L definiert und entsprechend befüllt), dann braucht das Befüllen der HASHED table schon wieder 50% länger als das der SORTED table! Ich habe das mal näher untersucht und bin zu folgendem, äußerst eigenartigem Ergebnis gelangt: Sobald die interne Tabelle (mindestens) ein Feld enthält, das nicht Teil des Tabellenschlüssels ist, dauert das Befüllen der SORTED TABLE deutlich länger. Gibt es kein solches Feld, dauert das Befüllen der HASHED TABLE deutlich länger. Mit den spezifischen Eigenschaften von SORTED und HASHED tables ist das nicht zu erklären, sondern muss als Eigenart des ABAP-Kernels interpretiert werden.

Sehr eigenartig, aber auch sehr interessant!

Schade, dass Ralf in diesem Thread nicht aktiv ist. Das wäre mal eine Frage gewesen, von der ich mir gewünscht hätte, dass er sie Horst Keller vorlegt, weshalb das so ist!

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag (Insgesamt 2):
nickname8Legxis


Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von tm987456 (ForumUser / 72 / 42 / 14 ) »
nickname8 hat geschrieben:Also ich habe eher User-Cases, wo ich richtige Tabellen lesen und verarbeiten muss. Und da ist mein Beispiel deutlich überlegen.
Aber trotzdem Danke für dein Quellcode. Das zeigt mir, dass Tabellen mit weniger komplexen Daten schneller sortiert verarbeitet werden können.
In deinem Testprogramm ist das Befüllen der sorted table gegenüber der hashed table langsamer, weil die Daten von einer unsortierten Tabelle kopiert werden. Wenn die Daten bereits im SQL sortiert werden, ist die Erzeugung der sorted table schneller.

Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
Beim befüllen der Hashed Table müssen die Daten auch kopiert werden, oder?

Habe auch zusätzlich zu dem kerneligen zuweisen der Tabellen mit '=' per LOOP und INSERT den Tabelleninhalt von der STANDARD TABLE kopiert. Da war die HASHED TABLE ebenfalls schneller. Das nur fürs Protokoll :)

Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
tm987456 hat geschrieben:In deinem Testprogramm ist das Befüllen der sorted table gegenüber der hashed table langsamer, weil die Daten von einer unsortierten Tabelle kopiert werden. Wenn die Daten bereits im SQL sortiert werden, ist die Erzeugung der sorted table schneller.
Falls das so sein sollte, müsste man dennoch fairerweise die Rechenzeit für die vorhergehende Sortierung draufrechnen, und dann geht die Rechnung auch wieder nicht auf. Aber das Ausschlaggebende scheint ja nicht zu sein, ob die Quelldaten sortiert reinkommen, sondern ob die interne Tabelle Felder enthält, die nicht Teil des Schlüssels sind! Idiotisch, aber offenbar Tatsache.
nickname8 hat geschrieben:Habe auch zusätzlich zu dem kerneligen zuweisen der Tabellen mit '=' per LOOP und INSERT den Tabelleninhalt von der STANDARD TABLE kopiert. Da war die HASHED TABLE ebenfalls schneller. Das nur fürs Protokoll :)
Ja, das habe ich auch getestet. Das wäre eigentlich die naheliegende Erklärung gewesen, aber leider ist es das nicht, sondern es liegt nur daran, ob die Tabelle noch Spalten hat, die nicht zum Schlüssel gehören. Was diese Frage mit hashed/sorted zu tun haben soll, kann wohl nur Horst Keller beantworten. Wenn, dann hätte ich erwartet, dass mit steigender Feldanzahl das Befüllen der Hashed-Tabelle langsamer wird, da mehr Felder zu hashen sind. Doch das Gegenteil ist der Fall. Wobei eben auch nicht die Zahl der Felder ausschlaggebend ist, sondern allein die boolesche Frage, ob es in der internen Tabelle auch Nichtschlüsselfelder gibt oder nicht.

Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von black_adept (Top Expert / 3944 / 105 / 886 ) »
DeathAndPain hat geschrieben:Ich habe das mal näher untersucht und bin zu folgendem, äußerst eigenartigem Ergebnis gelangt: Sobald die interne Tabelle (mindestens) ein Feld enthält, das nicht Teil des Tabellenschlüssels ist, dauert das Befüllen der SORTED TABLE deutlich länger. Gibt es kein solches Feld, dauert das Befüllen der HASHED TABLE deutlich länger. Mit den spezifischen Eigenschaften von SORTED und HASHED tables ist das nicht zu erklären, sondern muss als Eigenart des ABAP-Kernels interpretiert werden.
Idee: Initialwert-Sharing ( Wer ist eigentlich für dieses denglische Kauderwelsch verantwortlich? Auch Horst Keller? )
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von Bright4.5 (Specialist / 265 / 21 / 1 ) »
So, ich möchte gerne hier nochmal eine Idee in die Runde werfen.

Ich hab nun auf einer anderen Seite gelesen, das For all entries bei einer Menge von 5000 ziemlich langsam wird.

Wie stehen die Meinungen mit Open Cursor zu operieren?

Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Meines Wissens hat OPEN CURSOR keine Vorteile außer vielleicht dem, dass Sybase-Datenbanken bei sehr großen Fundmengen abstürzen sollen, wenn man sie in einem Rutsch einliest. Obwohl ich mit Sybase arbeite, habe ich das noch nicht erlebt, wohl aber ein Kollege von mir.
Bright4.5 hat geschrieben:Ich hab nun auf einer anderen Seite gelesen, das For all entries bei einer Menge von 5000 ziemlich langsam wird.
Da wäre es schön gewesen, wenn Du jene andere Seite mal verlinkt hättest. Ich persönlich halte das für ein Gerücht. Auf jeden Fall aber ist es datenbankabhängig. Wie gesagt, SQL-seitig wird es in einen IN-Operator umgesetzt. Der Kniff ist jetzt, dahinter nicht zu viele Werte aufzuzählen, weil sonst die Datenbank nicht mehr ihren Index benutzt. Das macht ABAP automatisch; man legt es als Profilparameter fest. Bei Oracle ist der empfohlene Wert 5, also wird je 5 Einträgen ein neuer SELECT abgesetzt. Bei Sybase liegt der Wert immerhin bei 128.

Wenn der FOR ALL ENTRIES also ineffizient wird, dann hat man seine Profilparameter unpassend für die eigene Datenbank gesetzt. Gibt da auch diverse SAP-Hinweise zu dem Thema.

Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
DeathAndPain hat geschrieben: Das macht ABAP automatisch; man legt es als Profilparameter fest. Bei Oracle ist der empfohlene Wert 5, also wird je 5 Einträgen ein neuer SELECT abgesetzt.
Deshalb ist es wichtig die doppelten Felder aus der Treibertabelle zu eliminieren. (Range aufbauen oder Treibertabelle kopieren, sortieren und Duplikate löschen)
Sonst könntest du den selber Datensatz mehrfach in den erwähnten verschiedenen SELECTs holen und das ist ja nicht Ziel der Sache.

Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von Bright4.5 (Specialist / 265 / 21 / 1 ) »
So, ich war nun leider sehr lange Zeit weg (Urlaub) und hatte andere Dinge zu tun :).

Frohes neues Jahr noch :).

Ich bin leider immer noch an dem Problem dran.

Ich hab nun in einem anderen Forum auch gelesen, dass ein NOT IN in einer Where-Clausel zu einem Full Table Scan führt.

Hier die Diskussion:
https://archive.sap.com/discussions/thread/382185

@Nickname8: Ich kenn mich damit leider (noch) nicht aus. Was bedeutet ein Full Table Scan genau (Ja, ich werde auch gleich mal noch googlen :D).
Wie kann ich so einen Full Table Scan vermeiden? Anstatt "NOT IN" einfach umdrehen und mit "IN" Verfahren?

Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von a-dead-trousers (Top Expert / 4276 / 213 / 1140 ) »
Bright4.5 hat geschrieben:Wie kann ich so einen Full Table Scan vermeiden? Anstatt "NOT IN" einfach umdrehen und mit "IN" Verfahren?
Bei einem "Full Table Scan" müssen ALLE Zeilen einer DB-Tabelle verglichen werden. Das NOT IN ist insofern schlecht, da ein NICHT TEIL einer Menge von Werten in den meisten Datenbanksystemen einen solchen FTS auslösen. Es sei denn, dass eine andere WHERE-Bedingung der SELECT-Anweisung die Menge soweit einschränkt, dass ein FTS nicht mehr notwendig ist.
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: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von Bright4.5 (Specialist / 265 / 21 / 1 ) »
Soweit schon mal vielen Dank !

Ich versuche mich gerade noch an einer anderen Variante mit einem Left Outer Join. Hierbei darf ja laut dieser Webseite:

https://www.tricktresor.de/blog/falle-b ... uter-join/

der LEFT OUTER JOIN die WHERE-Bedingung keine Einschränkung auf die rechte Tabelle haben.

Nun habe ich das Problem das bei meiner Where-Bedingung auf der rechten Tabelle auf zwei Select-Options geprüft wird.

left Outer join Tiban AS z
ON p1~iban = z~iban
AND p1~valid_from IN @so_valid_from
AND z~ERNAM IN @so_ernam.
INTO TABLE @it_Ergebnis.

Hier zickt er leider immer bei dem 'IN' rum. Ein '=' würde gehen, allerdings kein 'IN'.
Weiß jemand wie man sowas umgehen kann? Oder wie man es anders lösen kann?

Re: INTO CORRESPONDING FIELDS OF TABLE VS. INtO TABLE

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Bright,

was für Suchkriterien keinen Sinn machen, kannst Du Dir immer recht einfach selber erschließen, wenn Du Dir vorstellst, dass Deine Daten in einem (nach dem Primärschlüssel Deiner Tabelle sortierten) Telefonbuch stehen und Du händisch darin suchen möchtest.

Wenn ich Dir sage: Suche die Rufnummern aller Menschen mit dem Nachnamen "Meier" und dem Vornamen "Hans", dannn wirst Du das (alphabetisch sortierte) Buch schon in etwa an der richtigen Stelle aufschlagen und trotz 1000 Seiten schnell zu einem Ergebnis kommen.

Wenn ich Dir aber sage: Suche die Rufnummern aller Menschen, deren Nachname nicht mit S oder V anfängt, dann wird das schon bedeutend schwieriger. Wenn Du vermeiden willst, das Telefonbuch von vorne nach hinten Name für Name durchzugehen (das wäre ein "Full Table Scan"), dann musst Du Dir meine NOT-Anforderung in eine Anforderung ohne NOT umbauen, also sagen, dass Du stattdessen A bis R und dann noch T bis U und dann noch W bis Z suchen musst. Wie adt angedeutet hat, sind die meisten Datenbanksysteme nicht so clever, dass sie sich diese Umformung aus dem Index selber herleiten können, also bleibt ihnen als Alternative nur der Full Table Scan. Willst Du diesen vermeiden, dann mache die Umformung lieber in Deinem Programm und liefere der Datenbank eine positiv formulierte WHERE-Bedingung.
Hier zickt er leider immer bei dem 'IN' rum. Ein '=' würde gehen, allerdings kein 'IN'.
Weiß jemand wie man sowas umgehen kann? Oder wie man es anders lösen kann?
Der ON-Operator hat diverse syntaktische Einschränkungen. Ich rechne damit, dass Du Dein Problem lösen kannst, indem Du Deine Bedingung einfach in den WHERE-Block schreibst. Das ist auch inhaltlich richtiger: Der ON-Block soll nur die Kriterien enthalten, über die die gejointe Tabelle mit der Haupttabelle verknüpft ist. Bei Deinem IN-Operator prüfst Du aber nicht gegen diese, sondern gegen eine interne ABAP-Tabelle.

Also:

left Outer join Tiban AS z
ON p1~iban = z~iban
INTO TABLE @it_Ergebnis
WHERE p1~valid_from IN @so_valid_from
AND z~ERNAM IN @so_ernam.

Vergleichbare Themen

2
Antw.
13019
Views
„INTO CORRESPONDING FIELDS OF TABLE“ <--was ist falsch ?
von K0RN » 17.01.2012 16:18 • Verfasst in ABAP® für Anfänger
1
Antw.
4729
Views
sorted table, hashed table: Übergabe Workarea -> Performa
von Jürgen Fischer » 30.01.2006 08:09 • Verfasst in ABAP® Core
5
Antw.
9488
Views
standard table vs. sorted table
von ralf.wenzel » 31.07.2014 12:49 • Verfasst in ABAP® Core
11
Antw.
4868
Views
table to CSV
von Abapsocke » 18.02.2019 11:29 • Verfasst in ABAP® für Anfänger
1
Antw.
1883
Views
Table Control
von amjahid » 22.11.2007 13:57 • Verfasst in ABAP® für Anfänger

Aktuelle Forenbeiträge

PDF-Anzeige unter EDGE
vor 5 Tagen von jocoder 2 / 73

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

PDF-Anzeige unter EDGE
vor 5 Tagen von jocoder 2 / 73

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Wochen von Lucyalison 1 / 132
Group Items auf einer Filterbar
vor 4 Wochen von Bright4.5 1 / 166