[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Aug 2001
    Beiträge
    309

    SQL - Unterschied in STRSQL und SQLRPGLE

    wenn ich nachfolgende SQL Anweisung über "strsql" aufrufe,
    dann erhalte ich folgende Ergebnisse

    Umsatz
    196.783,30
    214.842,42
    20.981,26


    bau ich aber die Abfrage in ein SQLRPGLE ein, dann sind zwar die Ergebnisse gleich,
    aber die Sortierung der Daten ist unterschiedlich !!!

    Umsatz
    196.783,30
    20.981,26
    214.842,42


    Warum?



    PHP-Code:
    select sum(FKs) as Tagesumsatz                                                   
      from myLib
    .myFile                                                  
      where FKaa 
    and (not (int(FKaa/100000) = 86 or               
                                 
    int(FKaa/100000)=75)) and FK1=501    
      group by FKdd                                                     
      having FKdd between 1091201 
    and '1' concat substr(replace(char(current dateiso),'-' '') , 36

  2. #2
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... ohne order by überlässt man die Sortierung der Query engine, die je nach Zugriffsplan unterschiedlich liefern könnte.
    In diesem Fall liegt es vermutlich an der unterschiedlichen Optimierung: STRSQL tendiert zur Optimierung für wenige Zeilen, embedded SQL entscheidet sich öfter zur Optimierung für alle Zeilen.
    Wenn man das nicht haben will, brauchts einen order by.

    D*B

    PS: mit dem Wechsel von Sortierfolgen ist vermehrt nach Hardware oder Software Upgrade zu rechnen!!!

    Zitat Zitat von muadeep Beitrag anzeigen
    wenn ich nachfolgende SQL Anweisung über "strsql" aufrufe,
    dann erhalte ich folgende Ergebnisse

    Umsatz
    196.783,30
    214.842,42
    20.981,26


    bau ich aber die Abfrage in ein SQLRPGLE ein, dann sind zwar die Ergebnisse gleich,
    aber die Sortierung der Daten ist unterschiedlich !!!

    Umsatz
    196.783,30
    20.981,26
    214.842,42


    Warum?



    PHP-Code:
    select sum(FKs) as Tagesumsatz                                                   
      from myLib
    .myFile                                                  
      where FKaa 
    and (not (int(FKaa/100000) = 86 or               
                                 
    int(FKaa/100000)=75)) and FK1=501    
      group by FKdd                                                     
      having FKdd between 1091201 
    and '1' concat substr(replace(char(current dateiso),'-' '') , 36
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    309
    jede Summe steht für ein Datum

    Umsatz
    196.783,30 = 20091201
    20.981,26 = 20091203
    214.842,42 = 20091202



    wie kann ich dann da nach Datum sortieren
    (Datum kommt aus dem "having ...")

    PHP-Code:
    having FKdd between 1091201 and '1' concat substr(replace(char(current dateiso),'-' '') , 36

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... einfach das Datum mit in den Selct aufnehmen und danach sortieren.

    D*B

    Zitat Zitat von muadeep Beitrag anzeigen
    jede Summe steht für ein Datum

    Umsatz
    196.783,30 = 20091201
    20.981,26 = 20091203
    214.842,42 = 20091202



    wie kann ich dann da nach Datum sortieren
    (Datum kommt aus dem "having ...")

    PHP-Code:
    having FKdd between 1091201 and '1' concat substr(replace(char(current dateiso),'-' '') , 36
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    309
    versteh ich nicht!

    welches Datum denn?

    ich hab doch nur einen Datumsbereich
    ( ... between ... and ...)

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Deine Abfrage funktioniert auch nicht auf jedem Release und wie willst du die Ergebnisse zuordnen?

    select FKdd, sum(FKs) as Tagesumsatz
    from myLib
    .
    myFile
    where FKaa
    > 0 and (not (int(FKaa/100000) = 86
    or
    int(FKaa/100000)=75)) and FK1=
    501
    group by FKdd
    having FKdd between 1091201
    and '1' concat substr(replace(char(current date, iso),'-' , '') , 3, 6
    )

    order by FKdd
    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

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    ... FKDD muss nicht zwingend in die Auflistung beim Select übernommen werden (ist schon seit Release V5R1 nicht mehr erforderlich). Die Angabe im Order By reicht.
    Benötigt man eine bestimmte Reihenfolge des Ergebnisses, muss man IMMER einen Order By angeben. Ist die Reihenfolge dagegen egal, sollte man auf einen Order By verzichten.

    Embedded SQL und STRSQL können bei dem gleichen Statement unterschieldliche Indices ververwenden. Es kann sogar vorkommen, dass in einem Fall Table Scan und im anderen Fall ein Index verwendet wird.

    Der Grund herfür liegt im unterschiedlichen Optimierungsziel. Alle dynamischen SQL-Interfaces (zu denen auch STRSQL gehört) werden so optimiert, dass der erste Block der Daten so rasch wie möglich ausgegeben wird (Optimization Goal = *FIRSTIO). Statisches SQL wird dagegen so optimiert, dass das komplette Ergebnis so schnell wie möglich ausgegeben wird (Optimization Goal = *ALLIO).

    Auf das Optimierungsziel kann man durch das Hinzufügen von OPTIMIZE FOR x ROWS am Ende des Select-Statements. Wird für x ein sehr kleiner Integer-Wert angegeben wird *FIRSTIO verwendet, wird dagegen eine sehr große Zahl angegeben oder ALL wird das Optimiuerungsziel *ALLIO verwendet.

    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

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Ich habe da schon verschiedenes mit Optimize versucht, bin aber nie zum selben Ergebnis wie STRSQL gekommen.
    Selbst "Optimize for 1 rows" brachte keine Veränderung der Performance oder Sortierung bei embedded SQL.
    Woran das nun liegt, habe ich dann nicht weiter analysiert.
    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

  9. #9
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    man könnte probieren, beide einmal auszuführen (STRSQL und SQLRPGLE) und dann im plancache schaun obs 2 verschiedene zugriffspfad-einträge für den gleichen sql-befehl (in der ausgeführten Uhrzeit) gibt.

Similar Threads

  1. SQL Befehle unter strsql
    By MWendel in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 07-11-07, 12:00
  2. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  3. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  4. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43

Berechtigungen

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