Hi,
We are having trouble loading some cockpit pages, such as the dashboard and processes. Judging by the devtool, the problematic request goes to /process-definition/statistics?rootIncidents=true
and query looks like:
SELECT DISTINCT RES.*
FROM
(SELECT PROCDEF.*,
INSTANCE.INSTANCE_COUNT_,
INC.INCIDENT_TYPE_,
INC.INCIDENT_COUNT_
FROM ACT_RE_PROCDEF PROCDEF
LEFT OUTER JOIN
(SELECT E.PROC_DEF_ID_,
count(E.PROC_INST_ID_) AS INSTANCE_COUNT_
FROM ACT_RU_EXECUTION E
WHERE E.PARENT_ID_ IS NULL
GROUP BY E.PROC_DEF_ID_) INSTANCE ON PROCDEF.ID_ = INSTANCE.PROC_DEF_ID_
LEFT OUTER JOIN
(SELECT I.PROC_DEF_ID_,
I.INCIDENT_TYPE_,
count(I.ID_) AS INCIDENT_COUNT_
FROM ACT_RU_INCIDENT I
GROUP BY I.PROC_DEF_ID_,
I.INCIDENT_TYPE_) INC ON PROCDEF.ID_ = INC.PROC_DEF_ID_) RES
ORDER BY RES.ID_ ASC
LIMIT ?
OFFSET ?
After some analysis, we came to the conclusion that the bottleneck here is the repeated access to data from ACT_RU_EXECUTION
. The subquery itself takes about 100ms to process, but in the full query I attached above it is called ~800 times, so we end up with a long execution time. This query can be optimized, however I’m not sure if this can be done in Camunda:
WITH a AS materialized
(SELECT E.PROC_DEF_ID_, count(E.PROC_INST_ID_) AS INSTANCE_COUNT_
FROM ACT_RU_EXECUTION E
WHERE E.PARENT_ID_ IS NULL
AND (E.TENANT_ID_ IS NULL)
GROUP BY E.PROC_DEF_ID_)
SELECT DISTINCT RES.*
FROM
(SELECT PROCDEF.*,
INSTANCE.INSTANCE_COUNT_,
INC.INCIDENT_TYPE_,
INC.INCIDENT_COUNT_
FROM ACT_RE_PROCDEF PROCDEF
LEFT OUTER JOIN
(SELECT *
FROM a) INSTANCE ON PROCDEF.ID_ = INSTANCE.PROC_DEF_ID_
LEFT OUTER JOIN
(SELECT I.PROC_DEF_ID_,
I.INCIDENT_TYPE_,
count(I.ID_) AS INCIDENT_COUNT_
FROM ACT_RU_INCIDENT I
GROUP BY I.PROC_DEF_ID_,
I.INCIDENT_TYPE_) INC ON PROCDEF.ID_ = INC.PROC_DEF_ID_) RES
ORDER BY RES.ID_ ASC
LIMIT ?
OFFSET ?
Here the subquery is taken into materialization, in general the query remains the same, only the order and algorithm have changed, but it is executed in 100ms.
Are there any optimization options?
7.19.0 Camunda version
21 process definitions deployed
160k Running Process Instances
26 Deployments
Thanks