Sorry, aber ich muss weiter fragen wie ein Kindergartenkind: Wozu brauchst Du das?Bright4.5 hat geschrieben:Achso, ja zum Zählen von den Schleifendurchläufen...
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.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.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag (Insgesamt 2):
nickname8 • Legxis
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.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.
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.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.
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.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
Idee: Initialwert-Sharing ( Wer ist eigentlich für dieses denglische Kauderwelsch verantwortlich? Auch Horst Keller? )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.
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.Bright4.5 hat geschrieben:Ich hab nun auf einer anderen Seite gelesen, das For all entries bei einer Menge von 5000 ziemlich langsam wird.
Deshalb ist es wichtig die doppelten Felder aus der Treibertabelle zu eliminieren. (Range aufbauen oder Treibertabelle kopieren, sortieren und Duplikate löschen)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.
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.Bright4.5 hat geschrieben:Wie kann ich so einen Full Table Scan vermeiden? Anstatt "NOT IN" einfach umdrehen und mit "IN" Verfahren?
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.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?