berndl
18-03-14, 14:57
Hallo zusammen,
wir suchen seit 2 Tagen an einem seltsamen SQL-Performance-Problem und sind ziemlich ratlos, wo wir weitersuchen können.
System V7R1
PTF MF50684 ist seit 10.03.2011 permanent angelegt (scheint irgendetwas damit zu tun zu haben)
Aus ILE-RPG setzen wir dynamische SQLs ab. Die SQLs sind jeweils aus Performancegründen auf ein Trefferlimit von 200 Records beschränkt, welches der Benutzer aber übersteuern kann. Das SQL sieht verkürzt folgendermassen aus:
SELECT * FROM TAB1 FETCH FIRST 200 ROWS ONLY
Seit der letzten Migration unserer produktiven DB auf das neue System, sind die Antwortzeiten bei 200 Records ca. 10 - 15 Minuten (die gelieferte Ergebnismenge stimmt). Wird dieses Limit auf eine andere Zahl (z. B. 199 oder 201) geändert, ist das Verhalten normal (ca. 0,5 Sekunden bis Anzeige inkl. Clientlogik). Wird das SQL über den Greenscreen (STRSQL) oder System-i-Navigator abgesetzt, ist die Antwortzeit im Millisekundenbereich.
Während dieser 10 - 15 Minuten geht die CPU-Last des Jobs über 200 %. In den offenen Dateien sind keine Lesezugriffe nachvollziehbar und im Joblog wird trotz gestarteten Debug (STRSRVJOB + STRDBG) nichts protokolliert. Richtiges Debuging ist auf der Maschine im Moment leider (noch) nicht möglich.
Im Aufrufstapel sind die folgenden Programme (in dieser Reihenfolge eingetragen:
Programm___LIB___Anweisung__Prozedur
....
RISGSS16___RI2IPGM01___5279___RISGSS16 (SQL absetzendes ILE-RPG-Programm)
QSQROUTE___QSYS___12449___QSQROUTE
QSQRUN2___QSYS___11769___SQL_Fetch
QSQRUN2___QSYS___13964___F_GETNEXTL
QSQRUN2___QSYS___19733___F_GETBLK
QDBGETMQO___QSYS___2899___QDBGETMQO
Was macht QDBGETMQO?
Hat jemand einen Tipp zum weiteren Vorgehen?
Herzlichen Dank schon mal im Voraus
P.S. hier noch das komplette SQL (läuft schnell und fehlerfrei):
SELECT DISTINCT GES.*
FROM RIPGES AS GES
JOIN RIPGFG AS GFG ON GES.GESHID = GFG.GESHID
JOIN RIPSRS AS SRS ON GFG.FIRHID = SRS.FIRHID AND GFG.STEHID = SRS.STEHID
JOIN RIPGSB GSB ON GES.GESHID=GSB.GESHID AND GSB.PFAHID= 15 AND GSB.PERID= 3000003
AND GSB.GSBZOAB <= CURRENT_DATE AND GSB.GSBZOBIS >= CURRENT_DATE AND GSB.RIFISTGEL = '0'
WHERE
SRS.SRSGUEAB <= CURRENT_DATE AND SRS.SRSGUEBIS >= CURRENT_DATE AND GFG.FIRHID = SRS.FIRHID
AND GFG.STEHID= SRS.STEHID AND GFG.GFGSTS='5' AND SRS.RIFISTGEL ='0'
AND GFG.RIFISTGEL ='0' AND GES.RIFISTGEL ='0'
AND ((GFG.PFAHID = 0 AND GFG.PERID =0 ) OR (GFG.PFAHID=SRS.PFAHID AND GFG.PERID=SRS.PERID))
AND SRS.PFAHID = 15 AND SRS.PERID = 3000003 AND GES.FIRHID=102709 AND GES.GGPHID=100183
AND (GESABSDAT ='0001-01-01' OR GESABSDAT IS NULL)
ORDER BY GES.GESJAHR DESC, GES.GESNBR DESC
FETCH FIRST 200 ROWS ONLY;
wir suchen seit 2 Tagen an einem seltsamen SQL-Performance-Problem und sind ziemlich ratlos, wo wir weitersuchen können.
System V7R1
PTF MF50684 ist seit 10.03.2011 permanent angelegt (scheint irgendetwas damit zu tun zu haben)
Aus ILE-RPG setzen wir dynamische SQLs ab. Die SQLs sind jeweils aus Performancegründen auf ein Trefferlimit von 200 Records beschränkt, welches der Benutzer aber übersteuern kann. Das SQL sieht verkürzt folgendermassen aus:
SELECT * FROM TAB1 FETCH FIRST 200 ROWS ONLY
Seit der letzten Migration unserer produktiven DB auf das neue System, sind die Antwortzeiten bei 200 Records ca. 10 - 15 Minuten (die gelieferte Ergebnismenge stimmt). Wird dieses Limit auf eine andere Zahl (z. B. 199 oder 201) geändert, ist das Verhalten normal (ca. 0,5 Sekunden bis Anzeige inkl. Clientlogik). Wird das SQL über den Greenscreen (STRSQL) oder System-i-Navigator abgesetzt, ist die Antwortzeit im Millisekundenbereich.
Während dieser 10 - 15 Minuten geht die CPU-Last des Jobs über 200 %. In den offenen Dateien sind keine Lesezugriffe nachvollziehbar und im Joblog wird trotz gestarteten Debug (STRSRVJOB + STRDBG) nichts protokolliert. Richtiges Debuging ist auf der Maschine im Moment leider (noch) nicht möglich.
Im Aufrufstapel sind die folgenden Programme (in dieser Reihenfolge eingetragen:
Programm___LIB___Anweisung__Prozedur
....
RISGSS16___RI2IPGM01___5279___RISGSS16 (SQL absetzendes ILE-RPG-Programm)
QSQROUTE___QSYS___12449___QSQROUTE
QSQRUN2___QSYS___11769___SQL_Fetch
QSQRUN2___QSYS___13964___F_GETNEXTL
QSQRUN2___QSYS___19733___F_GETBLK
QDBGETMQO___QSYS___2899___QDBGETMQO
Was macht QDBGETMQO?
Hat jemand einen Tipp zum weiteren Vorgehen?
Herzlichen Dank schon mal im Voraus
P.S. hier noch das komplette SQL (läuft schnell und fehlerfrei):
SELECT DISTINCT GES.*
FROM RIPGES AS GES
JOIN RIPGFG AS GFG ON GES.GESHID = GFG.GESHID
JOIN RIPSRS AS SRS ON GFG.FIRHID = SRS.FIRHID AND GFG.STEHID = SRS.STEHID
JOIN RIPGSB GSB ON GES.GESHID=GSB.GESHID AND GSB.PFAHID= 15 AND GSB.PERID= 3000003
AND GSB.GSBZOAB <= CURRENT_DATE AND GSB.GSBZOBIS >= CURRENT_DATE AND GSB.RIFISTGEL = '0'
WHERE
SRS.SRSGUEAB <= CURRENT_DATE AND SRS.SRSGUEBIS >= CURRENT_DATE AND GFG.FIRHID = SRS.FIRHID
AND GFG.STEHID= SRS.STEHID AND GFG.GFGSTS='5' AND SRS.RIFISTGEL ='0'
AND GFG.RIFISTGEL ='0' AND GES.RIFISTGEL ='0'
AND ((GFG.PFAHID = 0 AND GFG.PERID =0 ) OR (GFG.PFAHID=SRS.PFAHID AND GFG.PERID=SRS.PERID))
AND SRS.PFAHID = 15 AND SRS.PERID = 3000003 AND GES.FIRHID=102709 AND GES.GGPHID=100183
AND (GESABSDAT ='0001-01-01' OR GESABSDAT IS NULL)
ORDER BY GES.GESJAHR DESC, GES.GESNBR DESC
FETCH FIRST 200 ROWS ONLY;