Skip to content

Commit 468c588

Browse files
committed
chore: fix performance of a couple of queries
Signed-off-by: Uroš Marolt <uros@marolt.me>
1 parent 3e15c35 commit 468c588

File tree

2 files changed

+77
-56
lines changed

2 files changed

+77
-56
lines changed

backend/src/database/repositories/memberRepository.ts

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -261,16 +261,25 @@ class MemberRepository {
261261
},
262262
options: IRepositoryOptions,
263263
): Promise<number> {
264+
const membersJoin = displayNameFilter
265+
? `JOIN members m ON m.id = mtm."memberId"
266+
JOIN members m2 ON m2.id = mtm."toMergeId"`
267+
: ''
268+
264269
const totalCount = await options.database.sequelize.query(
265270
`
266271
SELECT
267-
COUNT(DISTINCT mtm."memberId"::TEXT || mtm."toMergeId"::TEXT) AS count
272+
COUNT(*) AS count
268273
FROM "memberToMerge" mtm
269-
JOIN "memberSegmentsAgg" ms ON ms."memberId" = mtm."memberId"
270-
JOIN "memberSegmentsAgg" ms2 ON ms2."memberId" = mtm."toMergeId"
271-
join members m on m.id = mtm."memberId"
272-
join members m2 on m2.id = mtm."toMergeId"
273-
WHERE ms."segmentId" IN (:segmentIds) and ms2."segmentId" IN (:segmentIds)
274+
${membersJoin}
275+
WHERE EXISTS (
276+
SELECT 1 FROM "memberSegmentsAgg" ms
277+
WHERE ms."memberId" = mtm."memberId" AND ms."segmentId" IN (:segmentIds)
278+
)
279+
AND EXISTS (
280+
SELECT 1 FROM "memberSegmentsAgg" ms2
281+
WHERE ms2."memberId" = mtm."toMergeId" AND ms2."segmentId" IN (:segmentIds)
282+
)
274283
${memberFilter}
275284
${similarityFilter}
276285
${displayNameFilter}
@@ -360,7 +369,6 @@ class MemberRepository {
360369
const mems = await options.database.sequelize.query(
361370
`
362371
SELECT
363-
DISTINCT
364372
mtm."memberId" AS id,
365373
mtm."toMergeId",
366374
mtm.similarity,
@@ -370,11 +378,17 @@ class MemberRepository {
370378
m2."displayName" as "toMergeDisplayName",
371379
m2.attributes->'avatarUrl'->>'default' as "toMergeAvatarUrl"
372380
FROM "memberToMerge" mtm
373-
JOIN "memberSegmentsAgg" ms ON ms."memberId" = mtm."memberId"
374-
JOIN "memberSegmentsAgg" ms2 ON ms2."memberId" = mtm."toMergeId"
375-
join members m on m.id = mtm."memberId"
376-
join members m2 on m2.id = mtm."toMergeId"
377-
WHERE ms."segmentId" IN (:segmentIds) and ms2."segmentId" IN (:segmentIds) AND mtm.similarity IS NOT NULL
381+
JOIN members m ON m.id = mtm."memberId"
382+
JOIN members m2 ON m2.id = mtm."toMergeId"
383+
WHERE EXISTS (
384+
SELECT 1 FROM "memberSegmentsAgg" ms
385+
WHERE ms."memberId" = mtm."memberId" AND ms."segmentId" IN (:segmentIds)
386+
)
387+
AND EXISTS (
388+
SELECT 1 FROM "memberSegmentsAgg" ms2
389+
WHERE ms2."memberId" = mtm."toMergeId" AND ms2."segmentId" IN (:segmentIds)
390+
)
391+
AND mtm.similarity IS NOT NULL
378392
${memberFilter}
379393
${similarityFilter}
380394
${displayNameFilter}

backend/src/database/repositories/organizationRepository.ts

Lines changed: 51 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -807,37 +807,37 @@ class OrganizationRepository {
807807
},
808808
options: IRepositoryOptions,
809809
): Promise<number> {
810+
const organizationsJoin = displayNameFilter
811+
? `JOIN organizations o1 ON o1.id = otm."organizationId"
812+
JOIN organizations o2 ON o2.id = otm."toMergeId"`
813+
: ''
814+
810815
const result = await options.database.sequelize.query(
811816
`
812-
WITH
813-
cte AS (
814-
SELECT
815-
Greatest(Hashtext(Concat(org.id, otm."toMergeId")), Hashtext(Concat(otm."toMergeId", org.id))) as hash,
816-
org.id,
817-
otm."toMergeId",
818-
org."createdAt",
819-
otm."similarity"
820-
FROM organizations org
821-
JOIN "organizationToMerge" otm ON org.id = otm."organizationId"
822-
JOIN "organizationSegmentsAgg" os1 ON os1."organizationId" = org.id
823-
JOIN "organizationSegmentsAgg" os2 ON os2."organizationId" = otm."toMergeId"
824-
join organizations o1 on o1.id = org.id
825-
join organizations o2 on o2.id = otm."toMergeId"
826-
LEFT JOIN "mergeActions" ma
827-
ON ma.type = :mergeActionType
828-
AND (
829-
(ma."primaryId" = org.id AND ma."secondaryId" = otm."toMergeId")
830-
OR (ma."primaryId" = otm."toMergeId" AND ma."secondaryId" = org.id)
831-
)
832-
WHERE os1."segmentId" IN (:segmentIds)
833-
AND os2."segmentId" IN (:segmentIds)
834-
AND (ma.id IS NULL OR ma.state = :mergeActionStatus)
835-
${organizationFilter}
836-
${similarityFilter}
837-
${displayNameFilter}
817+
SELECT COUNT(DISTINCT Greatest(
818+
Hashtext(Concat(otm."organizationId", otm."toMergeId")),
819+
Hashtext(Concat(otm."toMergeId", otm."organizationId"))
820+
)) AS total_count
821+
FROM "organizationToMerge" otm
822+
${organizationsJoin}
823+
LEFT JOIN "mergeActions" ma
824+
ON ma.type = :mergeActionType
825+
AND (
826+
(ma."primaryId" = otm."organizationId" AND ma."secondaryId" = otm."toMergeId")
827+
OR (ma."primaryId" = otm."toMergeId" AND ma."secondaryId" = otm."organizationId")
828+
)
829+
WHERE EXISTS (
830+
SELECT 1 FROM "organizationSegmentsAgg" os1
831+
WHERE os1."organizationId" = otm."organizationId" AND os1."segmentId" IN (:segmentIds)
832+
)
833+
AND EXISTS (
834+
SELECT 1 FROM "organizationSegmentsAgg" os2
835+
WHERE os2."organizationId" = otm."toMergeId" AND os2."segmentId" IN (:segmentIds)
838836
)
839-
SELECT COUNT(DISTINCT hash) AS total_count
840-
FROM cte
837+
AND (ma.id IS NULL OR ma.state = :mergeActionStatus)
838+
${organizationFilter}
839+
${similarityFilter}
840+
${displayNameFilter}
841841
`,
842842
{
843843
replacements,
@@ -924,32 +924,39 @@ class OrganizationRepository {
924924
`WITH
925925
cte AS (
926926
SELECT
927-
Greatest(Hashtext(Concat(org.id, otm."toMergeId")), Hashtext(Concat(otm."toMergeId", org.id))) as hash,
928-
org.id,
927+
Greatest(Hashtext(Concat(otm."organizationId", otm."toMergeId")), Hashtext(Concat(otm."toMergeId", otm."organizationId"))) as hash,
928+
otm."organizationId" as id,
929929
otm."toMergeId",
930-
org."createdAt",
930+
o1."createdAt",
931931
otm."similarity",
932932
o1."displayName" as "primaryDisplayName",
933933
o1.logo as "primaryLogo",
934934
o2."displayName" as "secondaryDisplayName",
935935
o2.logo as "secondaryLogo",
936-
os1."segmentId" as "primarySegmentId",
937-
os2."segmentId" as "secondarySegmentId"
938-
FROM organizations org
939-
JOIN "organizationToMerge" otm ON org.id = otm."organizationId"
940-
JOIN "organizationSegmentsAgg" os1 ON os1."organizationId" = org.id
941-
JOIN "organizationSegmentsAgg" os2 ON os2."organizationId" = otm."toMergeId"
942-
join organizations o1 on o1.id = org.id
943-
join organizations o2 on o2.id = otm."toMergeId"
936+
(SELECT os1."segmentId" FROM "organizationSegmentsAgg" os1
937+
WHERE os1."organizationId" = otm."organizationId" AND os1."segmentId" IN (:segmentIds)
938+
LIMIT 1) as "primarySegmentId",
939+
(SELECT os2."segmentId" FROM "organizationSegmentsAgg" os2
940+
WHERE os2."organizationId" = otm."toMergeId" AND os2."segmentId" IN (:segmentIds)
941+
LIMIT 1) as "secondarySegmentId"
942+
FROM "organizationToMerge" otm
943+
JOIN organizations o1 ON o1.id = otm."organizationId"
944+
JOIN organizations o2 ON o2.id = otm."toMergeId"
944945
LEFT JOIN "mergeActions" ma
945946
ON ma.type = :mergeActionType
946947
AND (
947-
(ma."primaryId" = org.id AND ma."secondaryId" = otm."toMergeId")
948-
OR (ma."primaryId" = otm."toMergeId" AND ma."secondaryId" = org.id)
948+
(ma."primaryId" = otm."organizationId" AND ma."secondaryId" = otm."toMergeId")
949+
OR (ma."primaryId" = otm."toMergeId" AND ma."secondaryId" = otm."organizationId")
949950
)
950-
WHERE os1."segmentId" IN (:segmentIds)
951-
AND os2."segmentId" IN (:segmentIds)
952-
AND (ma.id IS NULL OR ma.state = :mergeActionStatus)
951+
WHERE EXISTS (
952+
SELECT 1 FROM "organizationSegmentsAgg" os1
953+
WHERE os1."organizationId" = otm."organizationId" AND os1."segmentId" IN (:segmentIds)
954+
)
955+
AND EXISTS (
956+
SELECT 1 FROM "organizationSegmentsAgg" os2
957+
WHERE os2."organizationId" = otm."toMergeId" AND os2."segmentId" IN (:segmentIds)
958+
)
959+
AND (ma.id IS NULL OR ma.state = :mergeActionStatus)
953960
${organizationFilter}
954961
${similarityFilter}
955962
${displayNameFilter}

0 commit comments

Comments
 (0)