[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Jun 2006
    Beiträge
    348

    Question Schlechte SQL Performance bei Join?

    Hallo zusammen,

    folgende Konstellation:
    - Tabelle A: Datensätze mit eindeutiger ID und einem langem Textfeld
    - Tabelle B: Datei für die Indizierung von Tabelle A. Enthält zu jedem Wort des Textefeldes von Tabelle A eine Zeile mit Bezug auf die eindeutige ID

    Mit folgendem SQL wird nun auf die Tabelle zugriffen:
    Code:
    with x as (                                                
    select IXFNAM, IXTEXT, IXRECL from matindex                
    where                                                      
          IXFNAM = 'DBTEXT'                                  
      and IXTEXT =    'KUNDE')                          
    SELECT                                                     
           'DBTEXT', PDPRN2, PDPRN3, PDKDK, PDMA, PDBTDT,    
     rtrim(PDTXT1)||rtrim(PDTXT2)||rtrim(PDTXT3)||             
     rtrim(PDTXT4)||rtrim(PDTXT5) as Txt                       
    FROM DBTEXT right join x on                              
                                IXRECL  = PDLFDN  order by pdbtdt
    Die MATINDEX Datei ist hier die Indizierungsdatei (B) und die DBTEXT die Tabelle (A).
    Ich habe schon verschiedene Variationen durchprobiert mit EXISTS, JOIN und nun diese common table expression.
    Die aktuelle Variante ist von der Performance her nun die Beste, aber allgemein bin ich mit der Leistung nicht zufrieden.
    Als Grund für die mangelhafte Performance habe ich das ORDER BY auf ein Datumsfeld ausgemacht. Wenn das SQL z.B. 9000 Sätze ausgibt braucht es auf einer 4000 CPW Power6 Maschine unter V5R4M0 etwa 20 Sekunden. Ohne ORDER BY sind es nur ca. 2 Sekunden.

    Was kann ich tun um diese Abfrage zu verbessern? Laut Visual Explain habe ich schon bei beiden Tabellen Zugriff über einen optimalen Index. Warum dauert das dennoch so lange?

    Die selben Abfragen (ohne CTE, aber mit Subselect) unter MySQL mit den gleichen Daten brauchen nur einen Bruchteil der Zeit.

    Was mache ich hier falsch?

    Gruß
    Matthias Schatte

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Was mich als erstes interessieren würde ist, welche Query Engine führt die Abfrage aus?
    So wie Du es beschreibst tippe ich stark auf die CQE. Ist es die CQE versuche die Ursache zu finden (und zu bereinigen), warum die CQE verwendet wurde.

    Hast Du eigentlich versucht anstatt eines Right Join die Abfrage zu drehen, d.h. die CTE voranstellen und dann über einen Left Join zu verknüpfen.

    Weiterhin sollte zumindest ein Zugriffsweg über IXFNAM, IXTEXT, IXRECL vorhanden sein. Ebenso sollte für die 2. Datei ein Index über PDLFDN, PDBTDT. Versuche ggf. Zugriffswege (SQL Indices) mit Schlüssel-Feldern in der zuvorgenannten Reihenfolge anzulegen.

    Birgitta
    Birgitta Hauser

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

  3. #3
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    RIGHT JOIN?

    Vielleicht ist es ein Problem mit NULL-Werten in der Spalte mit dem Datum, nach dem sortiert wird.

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Wieso eigentlich Right Join ?
    Auf Grund der Abfrage ist es doch eher ein inner join, da die Where-Klausel der Tabelle 1 eine Einschränkung unabhängig von der Beziehung zu Tabelle 2 ist.

    Du solltest also
    a) die Reihenfolge der Datenbeziehungen prüfen
    b) entsprechende Indizes über die Where-/Join-/Order-Felder haben

    Und was den Performancevergleich angeht:
    Wieviele parallele Job's laufen auf dem MySQL-Server im Vergleich zur AS/400 ?
    Wieviele Datensätze sind in der MySQL-DB und der AS/400-DB ?
    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
    Jun 2006
    Beiträge
    348
    Hallo,

    die Abfrage wird von der SQE durchgeführt laut Visual Explain und eure Indexvorschläge habe ich getestet.

    Das Ergebnis, auch mit den verschiedenen Join-Varianten, ist nun folgendes:
    Bei dem RIGHT JOIN (oder LEFT mit getauschten Positionen) ist die Performance vergleichbar mit einem INNER JOIN. Wird jedoch in der CTE auf die Tabelle MATINDEX ein WHERE auf einen Begriff durchgeführt, der nicht vorhanden ist, so dauert die Abfrage mit dem INNER JOIN beim ersten Aufruf extrem lange (29 Sekunden) und bei den folgenden Aufrufen immer 2,5 Sekunden.
    Der RIGHT und LEFT JOIN benötigen für die Abfrage auf einen Begriff, der nicht gefunden wird, immer 0,0 bis 0,3 Sekunden. Deshalb habe ich auch den RIGHT JOIN verwendet.

    Was kann ich hier noch tun? Die Abfrage soll ja in beiden Fällen schnell sein. Also wenn Sätze in der MATINDEX gefunden werden, als auch wenn keine gefunden werden.


    Zu MySQL:
    Ich habe sowohl auf der iSeries als auch auf der MySQL Maschine (Linux) ausserhalb des Tagesbetriebes getestet und war somit alleine auf der Maschine. Die Daten sind exakt die selben auf beiden Maschinen.


    Gruß
    Matthias Schatte

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... ich würde erst mal Software defect bei IBM reklamieren, vielleicht ist der Bug ja aus einem neueren Release Stand draußen. Ansonsten könnte man noch versuchen die Ausführung durch die alte Query Engine zu erzwingen (DDS LF mit Omit anlegen), die hat den Bug wahrscheinlich noch nicht gehabt.
    Wenn mehr Hardware dem nicht auf die Sprünge hilft, musst du das halt auf MySql laufen lassen...

    D*B

    Zitat Zitat von schatte Beitrag anzeigen
    Hallo,

    die Abfrage wird von der SQE durchgeführt laut Visual Explain und eure Indexvorschläge habe ich getestet.

    Das Ergebnis, auch mit den verschiedenen Join-Varianten, ist nun folgendes:
    Bei dem RIGHT JOIN (oder LEFT mit getauschten Positionen) ist die Performance vergleichbar mit einem INNER JOIN. Wird jedoch in der CTE auf die Tabelle MATINDEX ein WHERE auf einen Begriff durchgeführt, der nicht vorhanden ist, so dauert die Abfrage mit dem INNER JOIN beim ersten Aufruf extrem lange (29 Sekunden) und bei den folgenden Aufrufen immer 2,5 Sekunden.
    Der RIGHT und LEFT JOIN benötigen für die Abfrage auf einen Begriff, der nicht gefunden wird, immer 0,0 bis 0,3 Sekunden. Deshalb habe ich auch den RIGHT JOIN verwendet.

    Was kann ich hier noch tun? Die Abfrage soll ja in beiden Fällen schnell sein. Also wenn Sätze in der MATINDEX gefunden werden, als auch wenn keine gefunden werden.


    Zu MySQL:
    Ich habe sowohl auf der iSeries als auch auf der MySQL Maschine (Linux) ausserhalb des Tagesbetriebes getestet und war somit alleine auf der Maschine. Die Daten sind exakt die selben auf beiden Maschinen.


    Gruß
    Matthias Schatte
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  7. #7
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von schatte Beitrag anzeigen
    die Abfrage wird von der SQE durchgeführt laut Visual Explain und eure Indexvorschläge habe ich getestet.
    Im Visual Explain wird das SQL auf mehrere Prozesse aufgelöst. Da kannst du dir auch gleich ansehen, welche(r) Prozess(e) so lange dauert.

  8. #8
    Registriert seit
    Aug 2006
    Beiträge
    2.077
    Zitat Zitat von BenderD Beitrag anzeigen
    ... ich würde erst mal Software defect bei IBM reklamieren, vielleicht ist der Bug ja aus einem neueren Release Stand draußen. Ansonsten könnte man noch versuchen die Ausführung durch die alte Query Engine zu erzwingen (DDS LF mit Omit anlegen), die hat den Bug wahrscheinlich noch nicht gehabt.
    Wenn mehr Hardware dem nicht auf die Sprünge hilft, musst du das halt auf MySql laufen lassen...

    D*B
    Und das bei einer Maschine die 88 als Datenbankmaschine angetreten ist.
    Die wird dann von einer "freien" Software wie mysql in die Tasche gesteckt.
    Schon traurig
    GG

  9. #9
    Registriert seit
    Jul 2001
    Beiträge
    2.646
    Zitat Zitat von KingofKning Beitrag anzeigen
    Und das bei einer Maschine die 88 als Datenbankmaschine angetreten ist.
    Moment - Dieters Sätze sind manchmal mit einer gewissen Vorsicht zu geniessen, ein wenig Ironie und Bissigkeit kann schon dabei sein. Da ich gerade neben ihm sitze, gehe ich davon aus, dass das nicht seine ultimative Meinung zur Lösung des Problems ist. Aber wie geschrieben, nun brauchts Detailinfos.

    Nachtrag: ich werde so aus dem zweiten Blick nicht schlau, was Du genau aus welchen Dateien holst. Könntest Du die beiden Dateien genau beschreiben, was wo liegt, und *wann* Du welche Sätze mit welcher Kondition Verknüpfung holen willst. Und - bei solchen Dingen - ist Releasestand und PTF-Stand wichtig.


    -h

  10. #10
    Registriert seit
    Aug 2006
    Beiträge
    2.077
    Hallo Holger,
    wie Du weißt bin ich ein Fan der schwarzen Kiste, aber ich hatte gehofft das die Kiste im direketen Vergleich zu mysql besser ist ohne das man PTF Stand und intime Kenntnisse der QueryEngine haben muß.
    Das man mit dem Wissen von Birgitta mehr aus der Kiste rausholen kann ist schon klar aber auch einer wie ich sollte damit glücklich werden.

    GG

  11. #11
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von KingofKning Beitrag anzeigen
    Hallo Holger,
    wie Du weißt bin ich ein Fan der schwarzen Kiste, aber ich hatte gehofft das die Kiste im direketen Vergleich zu mysql besser ist ohne das man PTF Stand und intime Kenntnisse der QueryEngine haben muß.
    Das man mit dem Wissen von Birgitta mehr aus der Kiste rausholen kann ist schon klar aber auch einer wie ich sollte damit glücklich werden.

    GG
    Hi KingofKning,
    bin da ganz deiner Meinung.
    Ich glaube aber nicht, dass die beiden DB-Systeme ident sind. Oracle ist eine DB die man mit einer DB2 vergleichen kann, aber MySQL und das mit so einem großen unterschied?? Da könnten wir ja gleich MS-Access gegen die DB2 antreten lassen.
    Da wird mit Sicherheit irgendwas sein was extrem bremst. Eventuell Primärschlüsseln die bei MySQL vorhanden sind und bei der DB2 nicht? Dadurch hätte MySQL gegen der DB2 einen (nicht unwesendlichen) Vorteil.
    Deshalb würde ich auch (wie ich auch schon oben geschrieben habe) nachschauen was der Flaschenhals ist und dann sieht man schon genaueres.

    Eventuell sind die Einstellungen in der QAQQINI nicht korrekt. Schaun obs in der QUSRSYS eine QAQQINI gibt und welche Werte die hat. Wenn in der Lib eine vorhanden ist wird die nämlich als für alle SQL-Anweisungen als Default hergenommen.

    Noch ein kleiner Tipp: Egal ob mit SQL oder Native I/O bei DDS Tabellen werden die Daten nur beim Lesen geprüft und bei SQL-Tabellen nur beim Schreiben. Da mehr gelesen wird als geschrieben sind SQL-Tabellen auch Performanter.

  12. #12
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... ich meine schon, was ich schreibe!
    zur Problemstellung:
    ich gehe mal davon aus, dass DBTEXT nicht klein ist und MATINDEX um etliches größer und dass die Ergebnismenge eine hohe Selektivität hat, also um ein Vielfaches kleiner als DBTEXT ist. (right oder left join ist hier verkehrt!!! das ist ein klassischer Fall für einen inner join).

    Wenn obige Konstellation stimmt, hast du zwei Möglichkeiten:
    1. den Index auf das Sortierfeld zu löschen (falls der anderweitig nicht benötigt wird)
    2. Zweistufig arbeiten und im ersten Schritt ein Substrat ziehen (create table qtemp.ddd as (select ... from... !!! ohne order by!!!) und im zweiten Schritt select * from qtemp.ddd order by...)
    Das auch denkbare Festschreiben der Join Reihenfolge per QAQQINI könnte auch klappen, würde ich aber lassen, das macht andere Queries kaputt.

    Dass da eine Datenbank schneller als die andere sein kann, unabhängig von den Lizenzkosten, liegt daran, dass auf unterschiedliche Ziele optimiert wird - jede Datenbank hat ihre Stärken und Schwächen, die in einem inneren Zusammenhang stehen und da liegt es bei MySQL (bei der Abwesenheit von Lizenzkosten) schon nahe für eine spezifische Aufgabe, wenn sie denn kritisch ist, sich das Beste aus mehreren Welten zusammen zu packen!

    D*B


    Zitat Zitat von holgerscherer Beitrag anzeigen
    Moment - Dieters Sätze sind manchmal mit einer gewissen Vorsicht zu geniessen, ein wenig Ironie und Bissigkeit kann schon dabei sein. Da ich gerade neben ihm sitze, gehe ich davon aus, dass das nicht seine ultimative Meinung zur Lösung des Problems ist. Aber wie geschrieben, nun brauchts Detailinfos.

    Nachtrag: ich werde so aus dem zweiten Blick nicht schlau, was Du genau aus welchen Dateien holst. Könntest Du die beiden Dateien genau beschreiben, was wo liegt, und *wann* Du welche Sätze mit welcher Kondition Verknüpfung holen willst. Und - bei solchen Dingen - ist Releasestand und PTF-Stand wichtig.


    -h
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. SQL inner join
    By Robi in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 22-06-07, 15:52
  2. SQL left join
    By ahingerl in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 08-12-06, 08:28
  3. SQL JOIN
    By steven_r in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 19-10-06, 07:56
  4. MS Access ODBC mit JOIN: SQL FEHLER666
    By olafu in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 05-10-06, 08:13
  5. SQL Performance
    By mariupol1963 in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 11-08-06, 13:06

Berechtigungen

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