[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Apr 2019
    Beiträge
    43
    Mit der Abfrage werden denke ich keine Daten gebuffert.
    Vielleicht liegt das an der Where-Bedingung im join..

    Schon mal das probiert?

    Code:
    select feld1 from tabelle1 
    where key1 in 
    (Select key2 from Tabelle2 where tabelle2.nummer in (csvstring))

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Wie sieht es mit den Indices aus?
    Habt Ihr einen Index für die 2. Tabelle mit NUMMER (1.Schlüssel) und dann KEY (folg.Schlüssel)?
    Wenn nein leg mal an.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Ich würde es mit einem LEFT JOIN machen und die Reihenfolge des JOINs ändern:

    Code:
    select feld1 from tabelle2
    left join tabelle1 on key1=key2
    where tabelle2.nummer in (12345, 24575, 58713, <... 2000 weitere Werte ...>, 87548)
    lg Andreas

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    "left" ist der Default, wenn man das beim Join (wie oben gezeigt) weglässt.
    Hinzu kommt, dass eigentlich ein Inner-Join benötigt wird, da die Where-Klausel nicht auf NULL abfragt.

    Ich stimme da eher Birgitta zu.
    Vielleicht kann das dann per "exists" (automatisch) aufgelöst werden.
    Der Index kann entweder über "Key2, Number" oder umgekehrt erstellt werden.

    Ich kann mir andererseits nicht vorstellen, dass Hibernate hier so schlecht ist. D*B kann da ggf. mehr dazu sagen.
    Vielleicht stimmt das Datenmodell nicht ganz?
    Außerdem besteht die Gefahr, dass der SQL irgendwann größer 32K wird (falls die Grenze noch besteht).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    ... Hibernate ist so gut oder so schlecht wie man es verwendet. Auch hier sitzt das Problem eher vor dem Bildschirm.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  6. #6
    Registriert seit
    Apr 2019
    Beiträge
    43
    Left join ist definitiv nicht der default join..
    Ohne "Schnittmengenrichtungsangabe" (left, right, outer.. ) ist inner der default.

    https://stackoverflow.com/questions/...and-inner-join

  7. #7
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Vielen Dank für eure Antworten. Leider hat kein Vorschlag eine Beschleunigung gebracht. Ich habe das Statement umformuliert und auch die Indizes nochmal kontrolliert und neue angelegt. Hat alles keinen Effekt. Der Index Advisor verlangt auch keine weiteren Indizes mehr.

    Wenn ich das Statement mit der großen IN-Anweisung alleine ausführe, ist das Ergebnis sehr schnell da (weniger als 1 Sekunde). Sobald der join mit den anderen Tabelle dazukommt (egal in welcher Form: join, subselect, CTE) wird es langsam.

    Wir haben noch etwas herausgefunden. Wenn man dir Anzahl der IN-Elemente verringert, wird es ab einem bestimmten Punkt signifikant schneller. Bis 1024 Elemente scheint das ganze schnell zu gehen. Wenn man die Anzahl auf 1025 erhöht, wird es wieder extrem langsam.

    Aber mein Kollege programmiert seine Anwendung bereits um, sodass er das Problem ganz anders löst. Unser akutes Problem ist damit behoben.

    Nochmals vielen Dank für alle Tipps.

    Dieter

  8. #8
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Außerdem besteht die Gefahr, dass der SQL irgendwann größer 32K wird (falls die Grenze noch besteht).
    Unter 7.3 ist die maximale Länge eines SQL Statement 2 MB.

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Bzgl. des Joins stimmts, Inner ist der default.
    Allerdings bzgl. Where-Klausel ist das nicht relevant, da zumindest die DB2/400 dann automatisch sowieso einen Inner Join macht.
    Bewusst einen Left Join, der durch where zum inner wird, würde ich da sowieso nicht einführen.

    Die 1024 belegt nur, dass die Entwickler nicht mit mehr Elementen gerechnet haben und bis 1024 ggf. mit einer schnellen internen Hash-Tabelle arbeiten. Ab 1025 wird u.U. eine sequentielle Suche daraus.
    Da kann man sicherlich mal eine Fehlermeldung an die IBM schreiben.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Jan 2012
    Beiträge
    1.199
    Ich habe nochmal etwas getestet: Die Variante mit dem ... where exists ... ist etwa doppelt so schnell wie alle anderen Varianten (ca. 2,5 Sekunden).

    Aber wie gesagt, mein Kollege baut das jetzt alles ganz anders.

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Manchmal macht es auch Sinn, den SQL einfach umzudrehen:

    select feld1 from tabelle2
    [inner] join tabelle1 on key1=key2
    where tabelle2.nummer in (12345, 24575, 58713, <... 2000 weitere Werte ...>, 87548)

    und über Tabelle3.Nummer ggf. einen Index zu erstellen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Wandlungsfehler wegen PGMINFO
    By svit in forum IBM i Hauptforum
    Antworten: 14
    Letzter Beitrag: 18-06-15, 09:08
  2. Frage wegen DDS, CONCAT Funktion
    By a.wojcik in forum NEWSboard Programmierung
    Antworten: 24
    Letzter Beitrag: 16-01-15, 15:18
  3. Antworten: 3
    Letzter Beitrag: 21-05-14, 08:57
  4. Optimierung SQL Anweisung
    By Cassius in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 05-03-02, 19:28
  5. Antworten: 1
    Letzter Beitrag: 19-12-00, 06:43

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •