PDA

View Full Version : SQL Optimierung V5R4



Seiten : [1] 2

KingofKning
16-05-14, 09:12
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

Fuerchau
16-05-14, 09:18
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.

andreaspr@aon.at
16-05-14, 09:22
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

KingofKning
16-05-14, 09:28
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

KingofKning
16-05-14, 09:30
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 AndreasBlöde Frage (déja vu) Wie öffnest Du Visual Explain? Ich habe mir die Auswertung der Ergebnis-Datei mit Query angesehen.GG

BenderD
16-05-14, 09:31
... ein Zugriffspfad mit Feldern, die eine UDF enthalten kann nur temporär by the fly aufgebaut werden. (siehe auch Baldurs Antwort)

D*B

andreaspr@aon.at
16-05-14, 09:38
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 --> ...

Pikachu
16-05-14, 10:03
Vielleicht kannst du die UDFs optimieren (http://publib.boulder.ibm.com/infocenter/iseries/v5r4/topic/sqlp/rbafyimplement.htm)?

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."

Fuerchau
16-05-14, 10:40
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!

KingofKning
16-05-14, 12:49
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