WITH lookup AS (
SELECT
studies.publicid,
studies.internalid,
ROW_NUMBER() OVER (
ORDER BY order0.value DESC NULLS LAST
) AS rownumber
FROM
resources AS studies
LEFT JOIN metadata AS order0
ON order0.id = studies.internalid
AND order0.type = ?
WHERE
studies.resourcetype = ?
LIMIT ?
),
validgrandchildcounts AS (
SELECT
thislevel.internalid,
COALESCE(SUM(childlevel.childcount), ?) AS totalgrandchildcount
FROM
resources AS thislevel
LEFT JOIN resources AS childlevel
ON childlevel.parentid = thislevel.internalid
WHERE
NOT EXISTS (
SELECT ?
FROM invalidchildcounts
WHERE id = thislevel.internalid
)
AND NOT EXISTS (
SELECT ?
FROM resources AS child
JOIN invalidchildcounts
ON invalidchildcounts.id = child.internalid
WHERE child.parentid = thislevel.internalid
)
GROUP BY
thislevel.internalid
)
SELECT
? AS c0_queryid,
lookup.internalid AS c1_internalid,
lookup.rownumber AS c2_rownumber,
lookup.publicid AS c3_string1,
NULL::text AS c4_string2,
NULL::text AS c5_string3,
NULL::bytea AS c6_string4,
NULL::int AS c7_int1,
NULL::int AS c8_int2,
NULL::int AS c9_int3,
NULL::bigint AS c10_big_int1,
NULL::bigint AS c11_big_int2
FROM lookup
UNION ALL
SELECT
? AS c0_queryid,
lookup.internalid AS c1_internalid,
NULL::bigint AS c2_rownumber,
value AS c3_string1,
NULL::text AS c4_string2,
NULL::text AS c5_string3,
NULL::bytea AS c6_string4,
taggroup AS c7_int1,
tagelement AS c8_int2,
NULL::int AS c9_int3,
NULL::bigint AS c10_big_int1,
NULL::bigint AS c11_big_int2
FROM
lookup
INNER JOIN maindicomtags
ON maindicomtags.id = lookup.internalid
UNION ALL
SELECT
? AS c0_queryid,
lookup.internalid AS c1_internalid,
NULL::bigint AS c2_rownumber,
value AS c3_string1,
NULL::text AS c4_string2,
NULL::text AS c5_string3,
NULL::bytea AS c6_string4,
type AS c7_int1,
revision AS c8_int2,
NULL::int AS c9_int3,
NULL::bigint AS c10_big_int1,
NULL::bigint AS c11_big_int2
FROM
lookup
INNER JOIN metadata
ON metadata.id = lookup.internalid
UNION ALL
SELECT
? AS c0_queryid,
lookup.internalid AS c1_internalid,
NULL::bigint AS c2_rownumber,
label AS c3_string1,
NULL::text AS c4_string2,
NULL::text AS c5_string3,
NULL::bytea AS c6_string4,
NULL::int AS c7_int1,
NULL::int AS c8_int2,
NULL::int AS c9_int3,
NULL::bigint AS c10_big_int1,
NULL::bigint AS c11_big_int2
FROM
lookup
INNER JOIN labels
ON labels.id = lookup.internalid
UNION ALL
SELECT
? AS c0_queryid,
lookup.internalid AS c1_internalid,
NULL::bigint AS c2_rownumber,
value AS c3_string1,
NULL::text AS c4_string2,
NULL::text AS c5_string3,
NULL::bytea AS c6_string4,
taggroup AS c7_int1,
tagelement AS c8_int2,
NULL::int AS c9_int3,
NULL::bigint AS c10_big_int1,
NULL::bigint AS c11_big_int2
FROM
lookup
INNER JOIN resources AS childlevel
ON childlevel.parentid = lookup.internalid
INNER JOIN maindicomtags
ON maindicomtags.id = childlevel.internalid
AND (taggroup, tagelement) IN ((?, ?))
UNION ALL
SELECT
? AS c0_queryid,
lookup.internalid AS c1_internalid,
NULL::bigint AS c2_rownumber,
childlevel.publicid AS c3_string1,
NULL::text AS c4_string2,
NULL::text AS c5_string3,
NULL::bytea AS c6_string4,
NULL::int AS c7_int1,
NULL::int AS c8_int2,
NULL::int AS c9_int3,
NULL::bigint AS c10_big_int1,
NULL::bigint AS c11_big_int2
FROM
lookup
INNER JOIN resources AS childlevel
ON lookup.internalid = childlevel.parentid
UNION ALL
SELECT
? AS c0_queryid,
lookup.internalid AS c1_internalid,
NULL::bigint AS c2_rownumber,
NULL::text AS c3_string1,
NULL::text AS c4_string2,
NULL::text AS c5_string3,
NULL::bytea AS c6_string4,
NULL::int AS c7_int1,
NULL::int AS c8_int2,
NULL::int AS c9_int3,
COALESCE(
(
SELECT totalgrandchildcount
FROM validgrandchildcounts
WHERE internalid = lookup.internalid
),
(
SELECT COUNT(grandchildlevel.internalid)
FROM resources AS childlevel
INNER JOIN resources AS grandchildlevel
ON childlevel.internalid = grandchildlevel.parentid
WHERE lookup.internalid = childlevel.parentid
)
) AS c10_big_int1,
NULL::bigint AS c11_big_int2
FROM lookup
UNION ALL
SELECT
? AS c0_queryid,
lookup.internalid AS c1_internalid,
NULL::bigint AS c2_rownumber,
parentlevel.publicid AS c3_string1,
NULL::text AS c4_string2,
NULL::text AS c5_string3,
NULL::bytea AS c6_string4,
NULL::int AS c7_int1,
NULL::int AS c8_int2,
NULL::int AS c9_int3,
NULL::bigint AS c10_big_int1,
NULL::bigint AS c11_big_int2
FROM
lookup
INNER JOIN resources AS currentlevel
ON currentlevel.internalid = lookup.internalid
INNER JOIN resources AS parentlevel
ON currentlevel.parentid = parentlevel.internalid
ORDER BY
c0_queryid,
c2_rownumber; I am referring to this query, which is an internal query used by Orthanc i think so. I thought that this query is responsible for fetching all metadata and related information.
However, I am concerned about its performance, as it is taking more than 2 minutes to execute.
I would like to understand how this query can be optimized or whether there is a recommended approach in Orthanc to improve its execution time.