mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 21:47:32 +00:00
perf(query): reduce user query duration (#10037)
# Which Problems Are Solved The resource usage to query user(s) on the database was high and therefore could have performance impact. # How the Problems Are Solved Database queries involving the users and loginnames table were improved and an index was added for user by email query. # Additional Changes - spellchecks - updated apis on load tests # additional info needs cherry pick to v3
This commit is contained in:
@@ -1,41 +1,3 @@
|
||||
WITH login_names AS (
|
||||
SELECT
|
||||
u.id user_id
|
||||
, u.instance_id
|
||||
, u.resource_owner
|
||||
, u.user_name
|
||||
, d.name domain_name
|
||||
, d.is_primary
|
||||
, p.must_be_domain
|
||||
, CASE WHEN p.must_be_domain
|
||||
THEN concat(u.user_name, '@', d.name)
|
||||
ELSE u.user_name
|
||||
END login_name
|
||||
FROM
|
||||
projections.login_names3_users u
|
||||
JOIN lateral (
|
||||
SELECT
|
||||
p.must_be_domain
|
||||
FROM
|
||||
projections.login_names3_policies p
|
||||
WHERE
|
||||
u.instance_id = p.instance_id
|
||||
AND (
|
||||
(p.is_default IS TRUE AND p.instance_id = $2)
|
||||
OR (p.instance_id = $2 AND p.resource_owner = u.resource_owner)
|
||||
)
|
||||
ORDER BY is_default
|
||||
LIMIT 1
|
||||
) p ON TRUE
|
||||
JOIN
|
||||
projections.login_names3_domains d
|
||||
ON
|
||||
u.instance_id = d.instance_id
|
||||
AND u.resource_owner = d.resource_owner
|
||||
WHERE
|
||||
u.instance_id = $2
|
||||
AND u.id = $1
|
||||
)
|
||||
SELECT
|
||||
u.id
|
||||
, u.creation_date
|
||||
@@ -45,8 +7,8 @@ SELECT
|
||||
, u.state
|
||||
, u.type
|
||||
, u.username
|
||||
, (SELECT array_agg(ln.login_name)::TEXT[] login_names FROM login_names ln GROUP BY ln.user_id, ln.instance_id) login_names
|
||||
, (SELECT ln.login_name login_names_lower FROM login_names ln WHERE ln.is_primary IS TRUE) preferred_login_name
|
||||
, login_names.login_names AS login_names
|
||||
, login_names.preferred_login_name AS preferred_login_name
|
||||
, h.user_id
|
||||
, h.first_name
|
||||
, h.last_name
|
||||
@@ -73,6 +35,16 @@ LEFT JOIN
|
||||
ON
|
||||
u.id = n.user_id
|
||||
AND u.instance_id = n.instance_id
|
||||
LEFT JOIN LATERAL (
|
||||
SELECT
|
||||
ARRAY_AGG(ln.login_name ORDER BY ln.login_name) AS login_names,
|
||||
MAX(CASE WHEN ln.is_primary THEN ln.login_name ELSE NULL END) AS preferred_login_name
|
||||
FROM
|
||||
projections.login_names3 AS ln
|
||||
WHERE
|
||||
ln.user_id = u.id
|
||||
AND ln.instance_id = u.instance_id
|
||||
) AS login_names ON TRUE
|
||||
WHERE
|
||||
u.id = $1
|
||||
AND u.instance_id = $2
|
||||
|
Reference in New Issue
Block a user