PDA

View Full Version : SQL: Ausführungsverhalten einer Funktion in einem CASE-Statement



mwithake
08-08-05, 14:00
Hallo,

ich habe bei einer SQL-Abfrage in einem ELSE-Zweig eines CASE-Ausdruckes die Ausführung einer SQL-Funktion, die eine sehr zeitintensive RPG-Funktion aufruft:

SELECT ....

CASE WHEN MDMUS1<>'' THEN MDMUS1 ELSE MOD_getMKZ(afpmdt,afpmod,aumpgm,afpbsd) END

... FROM ...

Bedingt durch die Angabe der Funktion in dem ELSE-Zweig war ich davon ausgegangen, das die Funktion nur dann aufgerufen wird, wenn der ELSE-Zweig auch zur Anwendung kommt. Durch den I/O-Zähler in der Anzeige der offenen Dateien kann ich aber feststellen, das die Funktion für jeder Zeile der Abfrage ausgeführt wird und dadurch wird die Abfrage sehr langsam wird (167198 zu 12417 notwendige Aufrufe).

Hat jemand schon Erfahrungen mit diesem Thema gemacht? Gibt es eine Möglichkeit dieses Verhalten abzustellen?

M.Withake

BenderD
14-08-05, 15:44
Hallo,

ich denke, das man das nicht beeinflussen kann, was der Query Pessimizer sich da so zurecht denkt. Als Work around könnte man den Modus mit übergeben und wenn da wirklich was kommt, selbiges stumpf zurück geben ohne was aufzurufen.

mfg

Dieter Bender


Hallo,

ich habe bei einer SQL-Abfrage in einem ELSE-Zweig eines CASE-Ausdruckes die Ausführung einer SQL-Funktion, die eine sehr zeitintensive RPG-Funktion aufruft:

SELECT ....

CASE WHEN MDMUS1<>'' THEN MDMUS1 ELSE MOD_getMKZ(afpmdt,afpmod,aumpgm,afpbsd) END

... FROM ...

Bedingt durch die Angabe der Funktion in dem ELSE-Zweig war ich davon ausgegangen, das die Funktion nur dann aufgerufen wird, wenn der ELSE-Zweig auch zur Anwendung kommt. Durch den I/O-Zähler in der Anzeige der offenen Dateien kann ich aber feststellen, das die Funktion für jeder Zeile der Abfrage ausgeführt wird und dadurch wird die Abfrage sehr langsam wird (167198 zu 12417 notwendige Aufrufe).

Hat jemand schon Erfahrungen mit diesem Thema gemacht? Gibt es eine Möglichkeit dieses Verhalten abzustellen?

M.Withake

moserb
04-08-09, 14:57
Wir benutzen iseries V 5.4. Auch wir hatten ein solches Problem mit dem "CASE".

IBM hat aufgrund unserer Meldung ein PTF MF45019/MF45020 erstellt. Dieses beseitigt das Problem für die SQE. Es tritt jedoch weiterhin für die CQE auf und IBM beabsichtigt nicht es für die CQE zu fixen.

Da wir auch noch weitere Bugs im DB2 gefunden haben, die ebenfalls behoben wurden, sollte man auf jeden Fall den neuesten PTF-Stand auf der Maschine haben.