AAGN#88039: Performance issue bij assetmanagement en draaien/exporteren taken-overzicht.

svn path=/Website/trunk/; revision=71055
This commit is contained in:
Maykel Geerdink
2025-11-26 08:34:08 +00:00
parent 646d29e229
commit 86361747ef

View File

@@ -1035,7 +1035,7 @@ ins = {checkAutLevel:
+ " , ins_srtcontroledl_xcp_prio"
+ " , CASE"
+ " WHEN 1 = " + (hasInspect? 0 : 1) // lastinspect IS NULL
+ " THEN (SELECT d.ins_deel_aanmaak FROM ins_deel d WHERE d.ins_deel_key = ?)" // (1)
+ " THEN (SELECT d.ins_deel_aanmaak FROM ins_deel d WHERE d.ins_deel_key = " + pins_deel_key + ")"
+ " WHEN idsc.ins_deelsrtcontrole_status IN (0, 2, 3)"
+ " THEN ins_deelsrtcontrole_datum_org"
+ " ELSE fac.nextcyclusdate(CASE"
@@ -1053,8 +1053,8 @@ ins = {checkAutLevel:
+ " , ins.nextcyclusdate(xcp.ins_deel_key, xcp.ins_srtcontrole_key, 1, 0) inspectie_next0"
+ " , (SELECT MAX(idsc2.ins_deelsrtcontrole_key)"
+ " FROM ins_deelsrtcontrole idsc2"
+ " WHERE idsc2.ins_deel_key = ?" // (2)
+ " AND idsc2.ins_srtcontrole_key = ?" // (3)
+ " WHERE idsc2.ins_deel_key = " + pins_deel_key
+ " AND idsc2.ins_srtcontrole_key = " + params.srtcont_key
+ " AND idsc2.ins_scenario_key = 1) laatste"
+ " , (SELECT ins_controlemode_success"
+ " FROM ins_controlemode"
@@ -1068,56 +1068,30 @@ ins = {checkAutLevel:
+ " AND id2.ins_scenario_key = 1"
+ " AND id2.ins_deelsrtcontrole_key NOT IN (SELECT MAX(idsc2.ins_deelsrtcontrole_key)" // NOT IN (laatste). Laatste is niet altijd de insp.ins_deelsrtcontrole_key.
+ " FROM ins_deelsrtcontrole idsc2"
+ " WHERE idsc2.ins_deel_key = ?" // (4)
+ " AND idsc2.ins_srtcontrole_key = ?" // (5)
+ " WHERE idsc2.ins_deel_key = " + pins_deel_key
+ " AND idsc2.ins_srtcontrole_key = " + params.srtcont_key
+ " AND idsc2.ins_scenario_key = 1)) penultimate_dsc_key"
+ " FROM ins_deelsrtcontrole idsc"
+ " , ins_v_defined_inspect_xcp xcp"
+ " WHERE xcp.ins_srtcontrole_key = idsc.ins_srtcontrole_key(+)" // Er kan nog voor de eerste keer geinspecteerd moeten worden.
+ " AND xcp.ins_srtcontrole_key = ?" // (6)
+ " AND xcp.ins_deel_key = ?" // (7)
+ " AND idsc.ins_deel_key(+) = ?" // (8)
+ " AND idsc.ins_scenario_key(+) = ?" // (9)
+ " AND xcp.ins_srtcontrole_key = " + params.srtcont_key
+ " AND xcp.ins_deel_key = " + pins_deel_key
+ " AND idsc.ins_deel_key(+) = " + pins_deel_key
+ " AND idsc.ins_scenario_key(+) = " + params.scen_key
// Neem voor de rechten de xcp van de Active Situatie (AS). Die bepaalt of de soort controle vervallen is.
+ " AND xcp.ins_scenario_key = 1"
+ (params.deelsrtcont_key > 0
? " AND idsc.ins_deelsrtcontrole_key = ?" // (10)
? " AND idsc.ins_deelsrtcontrole_key = " + params.deelsrtcont_key
: " AND (idsc.ins_deelsrtcontrole_key IS NULL OR"
+ " idsc.ins_deelsrtcontrole_key = (SELECT MAX(idsc2.ins_deelsrtcontrole_key)"
+ " FROM ins_deelsrtcontrole idsc2"
+ " WHERE idsc2.ins_deel_key = ?" // (11)
+ " AND idsc2.ins_srtcontrole_key = ?" // (12)
+ " AND idsc2.ins_scenario_key = ?" // (13)
+ " WHERE idsc2.ins_deel_key = " + pins_deel_key
+ " AND idsc2.ins_srtcontrole_key = " + params.srtcont_key
+ " AND idsc2.ins_scenario_key = " + params.scen_key
+ " ))")
+ " ) insp"
+ " ORDER BY insp.ins_deelsrtcontrole_datum DESC";
// Als deze query honderden keren achter elkaar wordt uitgevoerd dan duurt de qyery ineens ~135 ms i.p.v. ~10 ms.
// Daardoor krijg je dan een timeout van de pagina
// Oorzaak kan liggen bij: Bind variable peeking / parameter sniffing.
// Dit kan leiden tot suboptimale plannen bij latere uitvoeringen.
// Als je de query uitvoert met verschillende parameters (zoals ins_srtcontrole_key = 1363 en ins_deel_key = 29382), kan het plan afhangen van de eerste uitvoering.
// Dit kan opgelost worden door hier een parameterized query te gebruiken.
//
// Voeg parameters toe in volgorde van de vraagtekens.
var oparams = [];
oparams.push({ typ: adInteger, dir: adParamInput, val: pins_deel_key }); // (1)
oparams.push({ typ: adInteger, dir: adParamInput, val: pins_deel_key }); // (2)
oparams.push({ typ: adInteger, dir: adParamInput, val: params.srtcont_key }); // (3)
oparams.push({ typ: adInteger, dir: adParamInput, val: pins_deel_key }); // (4)
oparams.push({ typ: adInteger, dir: adParamInput, val: params.srtcont_key }); // (5)
oparams.push({ typ: adInteger, dir: adParamInput, val: params.srtcont_key }); // (6)
oparams.push({ typ: adInteger, dir: adParamInput, val: pins_deel_key }); // (7)
oparams.push({ typ: adInteger, dir: adParamInput, val: pins_deel_key }); // (8)
oparams.push({ typ: adInteger, dir: adParamInput, val: params.scen_key }); // (9)
if (params.deelsrtcont_key > 0)
oparams.push({ typ: adInteger, dir: adParamInput, val: params.deelsrtcont_key }); // (10)
else
{
oparams.push({ typ: adInteger, dir: adParamInput, val: pins_deel_key }); // (11)
oparams.push({ typ: adInteger, dir: adParamInput, val: params.srtcont_key }); // (12)
oparams.push({ typ: adInteger, dir: adParamInput, val: params.scen_key }); // (13)
}
oRs = Oracle.ExecuteParam(sql, oparams);
var oRs = Oracle.Execute(sql);
// Waarden moeten aanwezig zijn. Mocht dat niet zo zijn dan is er iets fout.
// Als er nog nooit een inspectie is geweest wordt de status -1.
// Als de laatste inspectie is afgerond (status is 6) moet er een nieuwe inspectie gestart worden.
@@ -1262,8 +1236,8 @@ ins = {checkAutLevel:
var bsql = "SELECT COUNT(*) aantal"
+ " FROM (SELECT xcp.ins_srtcontrole_key"
+ " FROM ins_v_defined_inspect_xcp xcp"
+ " WHERE xcp.ins_deel_key = ?" // (1)
+ " AND xcp.ctr_discipline_key IN (SELECT w.ins_discipline_key" // Alleen van de discipl ines waar ik schrijf rechten op heb meetellen.
+ " WHERE xcp.ins_deel_key = " + pins_deel_key
+ " AND xcp.ctr_discipline_key IN (SELECT w.ins_discipline_key" // Alleen van de disciplines waar ik schrijf rechten op heb meetellen.
+ " FROM fac_v_webgebruiker w"
+ " , fac_functie f"
+ " WHERE w.fac_functie_key = f.fac_functie_key "
@@ -1271,10 +1245,7 @@ ins = {checkAutLevel:
+ " AND w.fac_gebruiker_prs_level_read < 9"
+ " AND w.fac_gebruiker_alg_level_read < 9"
+ " AND w.prs_perslid_key = " + user_key + "))";
// Ook hier een parameterized query gebruiken voor als de query zeer vaak achter elkaar wordt uitgevoerd.
var oparams = [];
oparams.push({ typ: adInteger, dir: adParamInput, val: pins_deel_key });
boRs = Oracle.ExecuteParam(bsql, oparams); // (1)
var boRs = Oracle.Execute(bsql);
var has_ctruse_read = boRs("aantal").Value > 0;
boRs.close();
var has_ctrsen_read = false;
@@ -1283,8 +1254,8 @@ ins = {checkAutLevel:
var bsql = "SELECT COUNT(*) aantal"
+ " FROM (SELECT xcp.ins_srtcontrole_key"
+ " FROM ins_v_defined_inspect_xcp xcp"
+ " WHERE xcp.ins_deel_key = ?" // (1)
+ " AND xcp.ctr_discipline_key IN (SELECT w.ins_discipline_key" // Alleen van de disciplines waar ik schrijf rechten op heb meetellen.
+ " WHERE xcp.ins_deel_key = " + pins_deel_key
+ " AND xcp.ctr_discipline_key IN (SELECT w.ins_discipline_key" // Alleen van de disciplines waar ik schrijf rechten op heb meetellen.
+ " FROM fac_v_webgebruiker w"
+ " , fac_functie f"
+ " WHERE w.fac_functie_key = f.fac_functie_key "
@@ -1292,10 +1263,7 @@ ins = {checkAutLevel:
+ " AND w.fac_gebruiker_prs_level_read < 9"
+ " AND w.fac_gebruiker_alg_level_read < 9"
+ " AND w.prs_perslid_key = " + user_key + "))";
// Ook hier een parameterized query gebruiken voor als de query zeer vaak achter elkaar wordt uitgevoerd.
oparams = [];
oparams.push({ typ: adInteger, dir: adParamInput, val: pins_deel_key });
boRs = Oracle.ExecuteParam(bsql, oparams); // (1)
var boRs = Oracle.Execute(bsql);
has_ctrsen_read = boRs("aantal").Value > 0;
boRs.close();
}
@@ -1307,8 +1275,8 @@ ins = {checkAutLevel:
var bsql = "SELECT COUNT(*) aantal"
+ " FROM (SELECT xcp.ins_srtcontrole_key"
+ " FROM ins_v_defined_inspect_xcp xcp"
+ " WHERE xcp.ins_deel_key = ?" // (1)
+ " AND xcp.ctr_discipline_key IN (SELECT w.ins_discipline_key" // Alleen van de disciplines waar ik schrijf rechten op heb meetellen.
+ " WHERE xcp.ins_deel_key = " + pins_deel_key
+ " AND xcp.ctr_discipline_key IN (SELECT w.ins_discipline_key" // Alleen van de disciplines waar ik schrijf rechten op heb meetellen.
+ " FROM fac_v_webgebruiker w"
+ " , fac_functie f"
+ " WHERE w.fac_functie_key = f.fac_functie_key "
@@ -1316,10 +1284,7 @@ ins = {checkAutLevel:
+ " AND w.fac_gebruiker_prs_level_write < 9"
+ " AND w.fac_gebruiker_alg_level_write < 9"
+ " AND w.prs_perslid_key = " + user_key + "))";
// Ook hier een parameterized query gebruiken voor als de query zeer vaak achter elkaar wordt uitgevoerd.
oparams = [];
oparams.push({ typ: adInteger, dir: adParamInput, val: pins_deel_key });
boRs = Oracle.ExecuteParam(bsql, oparams); // (1)
var boRs = Oracle.Execute(bsql);
var has_ctruse_write = boRs("aantal").Value > 0;
boRs.close();
var has_ctrsen_write = false;
@@ -1328,8 +1293,8 @@ ins = {checkAutLevel:
var bsql = "SELECT COUNT(*) aantal"
+ " FROM (SELECT xcp.ins_srtcontrole_key"
+ " FROM ins_v_defined_inspect_xcp xcp"
+ " WHERE xcp.ins_deel_key = ?" // (1)
+ " AND xcp.ctr_discipline_key IN (SELECT w.ins_discipline_key" // Alleen van de disciplines waar ik schrijf rechten op heb meetellen.
+ " WHERE xcp.ins_deel_key = " + pins_deel_key
+ " AND xcp.ctr_discipline_key IN (SELECT w.ins_discipline_key" // Alleen van de disciplines waar ik schrijf rechten op heb meetellen.
+ " FROM fac_v_webgebruiker w"
+ " , fac_functie f"
+ " WHERE w.fac_functie_key = f.fac_functie_key "
@@ -1337,10 +1302,7 @@ ins = {checkAutLevel:
+ " AND w.fac_gebruiker_prs_level_write < 9"
+ " AND w.fac_gebruiker_alg_level_write < 9"
+ " AND w.prs_perslid_key = " + user_key + "))";
// Ook hier een parameterized query gebruiken voor als de query zeer vaak achter elkaar wordt uitgevoerd.
oparams = [];
oparams.push({ typ: adInteger, dir: adParamInput, val: pins_deel_key }); // (1)
oRs = Oracle.ExecuteParam(bsql, oparams);
var boRs = Oracle.Execute(bsql);
has_ctrsen_write = boRs("aantal").Value > 0;
boRs.close();
}
@@ -6728,7 +6690,7 @@ ins = {checkAutLevel:
+ " AND sk.ins_srtkenmerk_verwijder IS NULL"
+ " AND sk.ins_srtkenmerk_kenmerktype = 'M'"
+ (inspect
? " AND k.ins_kenmerk_niveau IN ('C', 'E', 'T')" // C=Periodiek taken, E=Taakcategorie, T=Alle taken.
? " AND k.ins_kenmerk_niveau IN ('C', 'E', 'T')" // C=Periodiek taken, E=Taakcategorie, T=Alle taken.
+ " AND idsc.ins_srtcontrole_key = i.ins_srtcontrole_key"
+ " AND i.ctr_discipline_key = cd.ins_discipline_key"
+ " AND cd.ins_discipline_verwijder IS NULL"