[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    Mar 2002
    Beiträge
    5.379
    Zitat Zitat von mojo Beitrag anzeigen
    Wenn ich das recht in Erinnerung habe, dann sind PREPAREd Statements doch dynamische SQLs, richtig?

    Falls ja, sind diese nich von der Performance her viel schlechter, weil der SQL-PreCompiler bei der Modulerstellung keine Zugriffspfade aufbauen kann?
    Da werden doch dann bei jeder Ausführung des Statements aufs Neue die Zugriffspfade aufgebaut, oder?
    ... der Unterschied zwischen dynamic und static SQL liegt in den meisten praktischen Fällen unter der Messbarkeitsschwelle. Man kann ein Statement häufig einmal preparen und dann n mal ausführen, was den Aufwand minimiert , dann fällt der zusätzliche Aufwand nur einmal an und ab da hat man die gleiche Geschwinndigkeit wie bei static. Bei komplexen Statements wird der Access Plan zudem auch bei static SQL häufig dirty gesetzt und neu optimiert, sodass kein Unterschied zu dynamic SQL besteht.

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

  2. #2
    Registriert seit
    May 2015
    Beiträge
    10
    OK, das ist doch mal eine gute Aussage!

    Noch eine Frage:
    Ich habe noch dunkel im Hinterkopf, dass vom SQL-PreCompiler bei der Modulerstellung auch temporäre Indizes erstellt werden, was bei dynamischen SQLs ebenfalls zur Laufzeit gemacht wird und hier die Laufzeit extrem erhöhen kann.
    Ist das korrekt oder habe ich sich hier im Hinterkopf etwas verbuchselt?

    mojo

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.748
    Der SQL-Compiler erstellt keine temporären Indizes (wäre ja noch schöner).

    Alles zusammen wird in ein SQLPKG gepackt und in das Modul eingebettet (PRTSQLINF).
    Zur Laufzeit werden dann die Optimierungen durchgeführt.
    Ohne Prepare läuft aber sowieso nichts.
    Statische SQL's werden bei der Verwendung "prepared", Dynamische SQL's werden entweder manuell per Prepare oder automatisch beim "Execute direct" prepared.
    Dabei übernimmt die SQL-Runtime die Analyse.
    Es werden (häufig) Konstanten dann automatisch in temporäre Hostvariablen überführt und Parametermarker eingesetzt (warum auch immer).
    Es ist sogar noch nicht mal gewährleistet, dass 2 Open's mit unterschiedlichen Parametern den selben Zugriffsweg benutzen wobei nur die Wahrscheinlichkeit eben hoch ist.

    Verschärft wird das seit V7R1 dahingehend, dass alle Namen zur Laufzeit geprüft werden müssen, ob sie in den Tabellen oder als Variable vorhanden sind.
    Der Precompiler wirft nämlich keine Fehler mehr aus, wenn man sich bei Feldnamen vertippt hat.
    Er geht nun davon aus, dass dies ja später vorhandene Variablen sein könnten.
    Man kann also solche Fehler dann erst zur Laufzeit und nicht mehr zur Compilezeit finden zumal man bestimmte Buchstabendreher ja gerne überliest.
    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

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.379
    Zitat Zitat von mojo Beitrag anzeigen
    OK, das ist doch mal eine gute Aussage!

    Noch eine Frage:
    Ich habe noch dunkel im Hinterkopf, dass vom SQL-PreCompiler bei der Modulerstellung auch temporäre Indizes erstellt werden, was bei dynamischen SQLs ebenfalls zur Laufzeit gemacht wird und hier die Laufzeit extrem erhöhen kann.
    Ist das korrekt oder habe ich sich hier im Hinterkopf etwas verbuchselt?

    mojo
    - Irgendwelche Indexe legt der Compiler nicht an.
    - Zur Compiletime wird ein Accessplan berechnet und in einem Package gespeichert (das ist eine Art vorläufiger prepare).
    - Zur Runtime wird entschieden, ob der Accessplan noch verwendet werden soll.
    - Static SQL wird zur Compiletime geprüft (soweit möglich)
    - Accesspläne werden nach nicht dokumentierten Kriterien (es lohnt nicht drüber nachzudenken wie das im Moment gemacht wird, das kann sich ändern!!!) dirty gesetzt.
    - ein statischer Accessplan kann schlechter sein als ein dynamisch ermittelter (das gilt für etliche Käse-Zaubereine)

    Meine Empfehlungen:
    - einfacher ist immer besser!!!
    - Static wegen der Prüfungen bevorzugen
    - first make it right
    - Performance Optimierung nur wenn es tatsächlich zu langsam ist
    - Hauptmaßnahme für Performance Optimierung ist das anlegen erforderlicher Zugriffspfade.
    - (fast) alles andere ist Pille-Palle.

    D*B
    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
    May 2015
    Beiträge
    10
    ein Punkt ist mir noch eingefallen.

    -> Stichwort FULL OPEN

    Wie ist es damit?
    Bei einem DYNAMIC SQL muss ja vermutlich immer ein FULL OPEN gemacht werden, da sich ja auch die angesprochenen Tabellen ändern könnten, richtig?
    Das sollte bei STATIC SQL nicht der Fall sein, oder?
    Falls meine Vermutungen richtig sind wäre das bei großen Tabellen ggf. eine erheblicher Performance-Verlust, oder?

    Könnte ich hierzu bitte auch noch eure fachkundige Meinung haben?

    VG! mojo

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.379
    Zitat Zitat von mojo Beitrag anzeigen
    ein Punkt ist mir noch eingefallen.

    -> Stichwort FULL OPEN

    Wie ist es damit?
    Bei einem DYNAMIC SQL muss ja vermutlich immer ein FULL OPEN gemacht werden, da sich ja auch die angesprochenen Tabellen ändern könnten, richtig?
    Das sollte bei STATIC SQL nicht der Fall sein, oder?
    Falls meine Vermutungen richtig sind wäre das bei großen Tabellen ggf. eine erheblicher Performance-Verlust, oder?

    Könnte ich hierzu bitte auch noch eure fachkundige Meinung haben?

    VG! mojo
    ... wieder einer von den Mythen:
    - DB2/400 macht grundsätzlich einen lazy Close (versucht alle Tabellen offen zu halten)
    - die einzige Operation, die einen Close sicher erzwingt ist ein disconnect
    - ein full open dauert bei vorhandenem Index Millisekunden
    - wenn da was länger dauert, dann liegt das am Aufbau eines temporären Index
    - temporäre Indexe werden gecached (was bedeutet, dass ein erneuter open von der Größe einer Datei nicht abhängt und wieder Millisekunden dauert.
    - guter Stil ist, dass man für unterschiedliche Tabellen und SQLs nicht dásselbe Statement/Cursor verwendet (warum auch?)

    D*B
    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
    May 2015
    Beiträge
    10
    PERFECT!!

    Vielen Dank in die Runde!
    Hat mich einiges weiter gebracht!

    VG! mojo

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.748
    Und just in diesem Moment ein neues Problem bei V7R1:

    Bis vor ein paar Tagen lief ein SQL problemlos und performant.
    Nun ist es so, dass die Datenbasis im Leben auch schon mal anwächst.
    Und gerade deshalb scheint sich der Optimizer nun anders zu entscheiden.
    Verknüpft wird der Kundenstamm (ca. 20.000) mit den Rechnungsdaten (jetzt > 3Mio).
    Eigentlich ja überhaupt kein Problem.

    Die Abfrage per ODBC (nicht per STRSQL) dauerte länger als 1 Stunde mit halbstündiger Pause für ca. 8000 Ergebnissätze!

    Nun habe ich die Indexanalyse für diesen SQL neu gemacht, den vorgeschlagenen Index erstellt und die Abfrage ist wieder performant, also nur der reinen Netzübertragungszeit geschuldet.

    Dies ist für mich das Zeichen, dass die Art der Optimierung sehr stark vom vorhandenen Datenvolumen abhängt und man sich ggf. auf die STRSQL-Analyse im Debugmodus auch nicht immer verlassen kann.
    Dieselbe Abfrage dauerte nämlich mit oder ohne Index über STRSQL nur wenige Sekunden.
    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
    Nov 2003
    Beiträge
    2.422
    Nur die erste Seite am Bildschirm oder auch bei Ausgabe in eine Datei?

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Dieselbe Abfrage dauerte nämlich mit oder ohne Index über STRSQL nur wenige Sekunden.

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.379
    ... strsql und ODBC sind zwei völlig getrennt zu sehende Baustellen (interaktiv versus Server und die Subsystem Einstellungen differieren und STRSQL ist immer dynamic, wogegen ODBC meist ein Package konfiguriert hat, also static SQL´, wenn die Abfrage schon mal da war). Was die Datenmenge angeht, sind 20.000 * 3 Mio schon eine Menge Holz, falls da der Pessimizer einen cross join drausmacht.

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

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.748
    Bei 20.000 * 2.995 Mio war das halt noch kein Problem.
    Zumal bei allen Varianten die Tabelle mit 20.000 Sätzen immer "nach Eingangsfolge" verwendet wird.
    Es wird auch kein Index vorgeschlagen, obwohl beim Where Indexfelder verwendet werden.
    Aber was soll's, im Moment tut er es ja wieder.

    Hier sehne ich mich quasi nach der CQE.
    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

  12. #12
    Registriert seit
    Mar 2002
    Beiträge
    5.379
    ... wie sieht denn das SQL aus?
    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. Debug eines Java Programms im Batch mit RDi
    By Etherion in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 04-03-15, 14:34
  2. Antworten: 40
    Letzter Beitrag: 03-11-14, 10:15
  3. Telnet und Debug
    By Nili in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 04-10-02, 11:10
  4. DEBUG RPGLE
    By Liebhoff in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 01-03-02, 22:24

Tags for this Thread

Berechtigungen

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