-
SQL Optimierung V5R4
Hallo *all,
ich habe für unsere Außendienstler eine Kundendatei erstellt mit allen möglichen Informationen.
Um die Daten zusammenzustellen habe ich div. UDFs kreiert.
Die UDFs alleine funktionieren einwandfrei. Im Zusammenspiel geht es in die Hose.
Das Problem ist das dann Zugriffswege erstellt werden und daher die Abfrage mit Timeout abbricht. Unter V5R4 werden sie leider ja immer wieder neu erstellt.
Hatte jetzt mal ein strdbmon aktiviert. Ich kann aber aus der Auswertung des DBmon keine Handlungsanweisung erkennen wie ich die UDFs optimieren kann.
Er sagt mir zwar das er den Zugriffspfad erstellt aber nicht welchen.
Für sachdienliche Hinweise zur Ergreifung der Daten dankbar.
GG
-
Das Problem ist eigentlich nur dann, wenn deine UDF's in Where/Group by/Order By oder auch in " join ... on udf(...) = ..." verwendet werden.
Hierfür sind UDF's definitiv nicht geeignet und optimierbar.
Müssen Ergebnisse von UDF's aber auf diese Weise verwendet werden, so kann dies nur per Trigger mit Berechnung des Ergebnisses in einem neuen Feld/anderer Datei passieren, so dass über das Ergebnis auch ein Index gelegt werden kann.
Zugriffe innerhalb einer UDF werden auch separat optimiert.
-
Bei der zusammengefassten Übersicht vom DB Monitor solltest du auch die Anzahl der Abfragen sehen wo ein Index erstellt wurde.
Wenn du dort die Anweisungen/Zusammenfassung öffnest und den Visual Explain öffnest, solltest du den erstellten Index finden können.
Ansonsten könntest du über die System-View SYSPARTITIONINDEXES gehen.
Dort kannst du dir die temporär erstellten Indice anschauen.
lg Andreas
-
Hallo,die UDFs sind Teil einer View, da ich ja die Daten für die externe Anwendung aufbereiten muss. Ich möchte das alles gerne per SQL erledigen bevor ich mir da ein Cobol Programm schreibe.Wenn ich Deinen Vorschlag richtig verstehe würdest Du hingehen und z.B. über ein CLP die UDFs (zumindestens die zeitkritschen) laufen lassen, die Ergebnisse davon in eine Datei schreiben und das dann auswerten.GG
-
Zitat von andreaspr@aon.at
Bei der zusammengefassten Übersicht vom DB Monitor solltest du auch die Anzahl der Abfragen sehen wo ein Index erstellt wurde.Wenn du dort die Anweisungen/Zusammenfassung öffnest und den Visual Explain öffnest, solltest du den erstellten Index finden können.Ansonsten könntest du über die System-View SYSPARTITIONINDEXES gehen.Dort kannst du dir die temporär erstellten Indice anschauen.lg Andreas
Blöde Frage (déja vu) Wie öffnest Du Visual Explain? Ich habe mir die Auswertung der Ergebnis-Datei mit Query angesehen.GG
-
... ein Zugriffspfad mit Feldern, die eine UDF enthalten kann nur temporär by the fly aufgebaut werden. (siehe auch Baldurs Antwort)
D*B
-
Zitat von KingofKning
Blöde Frage (déja vu) Wie öffnest Du Visual Explain? Ich habe mir die Auswertung der Ergebnis-Datei mit Query angesehen.GG
Im System i Navigator. Dort werden die Auswertungen hübscher dargestellt und dort gibt es auch den Visual Explain.
Deine Verbindung --> Datenbanken --> DeineDB --> SQL Perf. Monitors --> ...
-
Vielleicht kannst du die UDFs optimieren?
Zum Beispiel, falls sie die gleichen Ergebnisse für die selben Eingabewerte liefern:
"Use the DETERMINISTIC option on procedures and UDFs that return the same results for identical inputs. This allows the optimizer to cache the results of a function call or order where the function is called in the execution stream to reduce the run time."
-
Das Problem ist und bleibt die Verwendung von UDF-Ergebnissen in Where usw.
Hier erfolgt halt immer ein Tablescan und ist deshalb nicht optimierbar.
Deterministic hilft in diesem Fall auch nicht. Dies spart ggf. den Aufruf der UDF aber nicht den Tablescan. Wobei die Anzahl der Caches nicht unendlich ist.
Durch die Verlagerung in eine View ist das von außen noch nicht mal sichtbar.
Die UDF wird vor der Prüfung der restlichen Where's aufgerufen!
-
Also wenn ich sehe das die Original Datei mal gerade 72 Mio Sätze hat und der erzeugte Index dann 20.000 Einträge hat braucht der Sasck 2 Minuten 50 um den ersten Satz anzuzeigen.
Das dumme ist das die UDF wiederum auf eine View zurückgreift.
Das zu optimieren wird schwierig, vermutlich werde ich jeweils eine Datei erzeugen und die mit join in die Original-Datei einbinden.Nicht schön aber selten.
GG
-
... was machen Deine UDFs denn überhaupt?
-
SQL verwendet keine Indizes die Einschränkungen aufweisen.
Deine 20.000 Indexeinträge deuten auf eine Select/Omit-LF hin.
Diese kannst du im SQL getrost vergessen!
Besser ist hier ein Index, der die Select/Omit-Felder enthält, der ist dann verwendungsfähig.
Die View muss dann allerdings hier die Where-Klausel enthalten.
Similar Threads
-
By roti in forum NEWSboard Server Software
Antworten: 2
Letzter Beitrag: 17-02-14, 11:23
-
By dino in forum IBM i Hauptforum
Antworten: 9
Letzter Beitrag: 18-12-13, 13:59
-
By TR1 in forum NEWSboard Java
Antworten: 1
Letzter Beitrag: 02-11-13, 14:02
-
By Cassius in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 05-03-02, 19:28
-
By thomsta in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 07-02-02, 10:54
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks