Prisma join performances #4744
Comments
Hey @Hebilicious , |
@mavilein That's very good to hear ! Thank you for all your work on Prisma, I've been using it a lot recently and I'm happy to contribute (I have a few suggestions for prisma2, need to find the time to post them). |
For what it's worth we are having similar problems. Our migration from MySql on Aurora to Postgres on Aurora degraded performances badly (Queries takes ~10x longer than on mysql, and manual queries with similar results are also much faster) |
Hello, we also noticed poor performances with join on big queries (Postgres Aurora & Postgres on RDS). Our model has some limitations we are currently addressing (see queries below), but some optimizations could be done at prisma level too, mainly with table relations. We have 20+ types, so I won't put the whole schema here, but if you need more information I'd be happy to help. Here is a simple example: type User @db(name: "User") {
id: ID! @id
name: String!
email: String! @unique
password: String!
createdAt: DateTime! @createdAt
updatedAt: DateTime! @updatedAt
deletedAt: DateTime
expertOfMissions: [Mission!]! @relation(name: "MissionExpert", link: TABLE)
organizations: [Organization!]! @relation(name: "OrganizationUsers", link: TABLE)
adminIn: [Organization!]! @relation(name: "OrganizationAdmin")
}
type Organization @db(name: "Organization") {
id: ID! @id
name: String!
description: String
createdAt: DateTime! @createdAt
updatedAt: DateTime! @updatedAt
deletedAt: DateTime
admins: [User!]! @relation(name: "OrganizationAdmin", link: TABLE)
users: [User!]! @relation(name: "OrganizationUsers")
}
type Mission @db(name: "Mission") {
id: ID! @id
name: String
createdAt: DateTime! @createdAt
updatedAt: DateTime! @updatedAt
deletedAt: DateTime
experts: [User!]! @relation(name: "MissionExpert")
} Prisma would generate tables like the following:
Now let's say I want mission ids and names which user query expertOfMissions($id: ID!) {
missions(where: {experts_some: {id: $id}}) {
id
name
}
} Prisma generates the following SQL query: select
"Alias"."id",
"Alias"."name"
from "service$stage"."Mission" as "Alias"
where "Alias"."id" in (
select "service$stage"."_MissionExpert"."A"
from "service$stage"."_MissionExpert"
join "service$stage"."User" as "User_Alias"
on "User_Alias"."id" = "service$stage"."_MissionExpert"."B"
where "User_Alias"."id" = 'cjvy026t7515i07463lkm5n32'
)
order by "Alias"."id" asc
offset 0 Query seems pretty fine, but since I'm not requesting any user's attribute, nor filtering on anything else than his id, the join on User is actually useless. And in big queries, many useless joins can have a high cost. Simple optimized query would look like: select
"Alias"."id",
"Alias"."name"
from "service$stage"."Mission" as "Alias"
where "Alias"."id" in (
select "service$stage"."_MissionExpert"."A"
from "service$stage"."_MissionExpert"
where "service$stage"."_MissionExpert"."B" = 'cjvy026t7515i07463lkm5n32'
)
order by "Alias"."id" asc
offset 0 So can you have an idea of the impact of such limitation, here is an example SQL query generated by Prisma, which timeout after 300 sec (I defined statement_timeout to 300s...): SELECT "Alias"."id"
FROM "service$stage"."Structure" AS "Alias"
WHERE (("Alias"."id" IN
(SELECT "service$stage"."Structure"."id"
FROM "service$stage"."Structure"
WHERE "service$stage"."Structure"."organization" IN
(SELECT "service$stage"."_OrganizationUsers"."A"
FROM "service$stage"."_OrganizationUsers"
JOIN "service$stage"."User" AS "User_Organization_Alias" ON "User_Organization_Alias"."id" = "service$stage"."_OrganizationUsers"."B"
WHERE "User_Organization_Alias"."id" = 'cjvy026t7515i07463lkm5n32' ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureOwners"."A"
FROM "service$stage"."_StructureOwners"
JOIN "service$stage"."User" AS "User_Alias" ON "User_Alias"."id" = "service$stage"."_StructureOwners"."B"
WHERE "User_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureDevelopers"."A"
FROM "service$stage"."_StructureDevelopers"
JOIN "service$stage"."User" AS "User_Alias" ON "User_Alias"."id" = "service$stage"."_StructureDevelopers"."B"
WHERE "User_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureOperators"."A"
FROM "service$stage"."_StructureOperators"
JOIN "service$stage"."User" AS "User_Alias" ON "User_Alias"."id" = "service$stage"."_StructureOperators"."B"
WHERE "User_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructurePlanStructures"."A"
FROM "service$stage"."_StructurePlanStructures"
WHERE "service$stage"."_StructurePlanStructures"."B" IN
(SELECT "service$stage"."_StructurePlanMissionPlan"."B"
FROM "service$stage"."_StructurePlanMissionPlan"
WHERE "service$stage"."_StructurePlanMissionPlan"."A" IN
(SELECT "service$stage"."Mission"."plan"
FROM "service$stage"."Mission"
JOIN "service$stage"."Mission" AS "Mission_MissionPlan_StructurePlan_Alias" ON "Mission_MissionPlan_StructurePlan_Alias"."id" = "service$stage"."Mission"."id"
WHERE ("Mission_MissionPlan_StructurePlan_Alias"."id" IN
(SELECT "service$stage"."_MissionOperator"."A"
FROM "service$stage"."_MissionOperator"
JOIN "service$stage"."User" AS "User_Mission_MissionPlan_StructurePlan_Alias" ON "User_Mission_MissionPlan_StructurePlan_Alias"."id" = "service$stage"."_MissionOperator"."B"
WHERE "User_Mission_MissionPlan_StructurePlan_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Alias"."id" IN
(SELECT "service$stage"."_MissionClients"."A"
FROM "service$stage"."_MissionClients"
JOIN "service$stage"."User" AS "User_Mission_MissionPlan_StructurePlan_Alias" ON "User_Mission_MissionPlan_StructurePlan_Alias"."id" = "service$stage"."_MissionClients"."B"
WHERE "User_Mission_MissionPlan_StructurePlan_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Alias"."id" IN
(SELECT "service$stage"."_MissionInspector"."A"
FROM "service$stage"."_MissionInspector"
JOIN "service$stage"."User" AS "User_Mission_MissionPlan_StructurePlan_Alias" ON "User_Mission_MissionPlan_StructurePlan_Alias"."id" = "service$stage"."_MissionInspector"."B"
WHERE "User_Mission_MissionPlan_StructurePlan_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Alias"."id" IN
(SELECT "service$stage"."_MissionExpert"."A"
FROM "service$stage"."_MissionExpert"
JOIN "service$stage"."User" AS "User_Mission_MissionPlan_StructurePlan_Alias" ON "User_Mission_MissionPlan_StructurePlan_Alias"."id" = "service$stage"."_MissionExpert"."B"
WHERE "User_Mission_MissionPlan_StructurePlan_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )) ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."Structure"."id"
FROM "service$stage"."Structure"
WHERE "service$stage"."Structure"."organization" IN
(SELECT "service$stage"."_OrganizationUsers"."A"
FROM "service$stage"."_OrganizationUsers"
JOIN "service$stage"."User" AS "User_Organization_Structure_Alias" ON "User_Organization_Structure_Alias"."id" = "service$stage"."_OrganizationUsers"."B"
WHERE "User_Organization_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureOwners"."A"
FROM "service$stage"."_StructureOwners"
JOIN "service$stage"."User" AS "User_Structure_Alias" ON "User_Structure_Alias"."id" = "service$stage"."_StructureOwners"."B"
WHERE "User_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureDevelopers"."A"
FROM "service$stage"."_StructureDevelopers"
JOIN "service$stage"."User" AS "User_Structure_Alias" ON "User_Structure_Alias"."id" = "service$stage"."_StructureDevelopers"."B"
WHERE "User_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureOperators"."A"
FROM "service$stage"."_StructureOperators"
JOIN "service$stage"."User" AS "User_Structure_Alias" ON "User_Structure_Alias"."id" = "service$stage"."_StructureOperators"."B"
WHERE "User_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructurePlanStructures"."A"
FROM "service$stage"."_StructurePlanStructures"
WHERE "service$stage"."_StructurePlanStructures"."B" IN
(SELECT "service$stage"."_StructurePlanMissionPlan"."B"
FROM "service$stage"."_StructurePlanMissionPlan"
WHERE "service$stage"."_StructurePlanMissionPlan"."A" IN
(SELECT "service$stage"."Mission"."plan"
FROM "service$stage"."Mission"
JOIN "service$stage"."Mission" AS "Mission_MissionPlan_StructurePlan_Structure_Alias" ON "Mission_MissionPlan_StructurePlan_Structure_Alias"."id" = "service$stage"."Mission"."id"
WHERE ("Mission_MissionPlan_StructurePlan_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionOperator"."A"
FROM "service$stage"."_MissionOperator"
JOIN "service$stage"."User" AS "User_Mission_MissionPlan_StructurePlan_Structure_Alias" ON "User_Mission_MissionPlan_StructurePlan_Structure_Alias"."id" = "service$stage"."_MissionOperator"."B"
WHERE "User_Mission_MissionPlan_StructurePlan_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionClients"."A"
FROM "service$stage"."_MissionClients"
JOIN "service$stage"."User" AS "User_Mission_MissionPlan_StructurePlan_Structure_Alias" ON "User_Mission_MissionPlan_StructurePlan_Structure_Alias"."id" = "service$stage"."_MissionClients"."B"
WHERE "User_Mission_MissionPlan_StructurePlan_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionInspector"."A"
FROM "service$stage"."_MissionInspector"
JOIN "service$stage"."User" AS "User_Mission_MissionPlan_StructurePlan_Structure_Alias" ON "User_Mission_MissionPlan_StructurePlan_Structure_Alias"."id" = "service$stage"."_MissionInspector"."B"
WHERE "User_Mission_MissionPlan_StructurePlan_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionExpert"."A"
FROM "service$stage"."_MissionExpert"
JOIN "service$stage"."User" AS "User_Mission_MissionPlan_StructurePlan_Structure_Alias" ON "User_Mission_MissionPlan_StructurePlan_Structure_Alias"."id" = "service$stage"."_MissionExpert"."B"
WHERE "User_Mission_MissionPlan_StructurePlan_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )) ) ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."Structure"."id"
FROM "service$stage"."Structure"
WHERE "service$stage"."Structure"."organization" IN
(SELECT "service$stage"."_OrganizationUsers"."A"
FROM "service$stage"."_OrganizationUsers"
JOIN "service$stage"."User" AS "User_Organization_Structure_Structure_Alias" ON "User_Organization_Structure_Structure_Alias"."id" = "service$stage"."_OrganizationUsers"."B"
WHERE "User_Organization_Structure_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' ) ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureOwners"."A"
FROM "service$stage"."_StructureOwners"
JOIN "service$stage"."User" AS "User_Structure_Structure_Alias" ON "User_Structure_Structure_Alias"."id" = "service$stage"."_StructureOwners"."B"
WHERE "User_Structure_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureDevelopers"."A"
FROM "service$stage"."_StructureDevelopers"
JOIN "service$stage"."User" AS "User_Structure_Structure_Alias" ON "User_Structure_Structure_Alias"."id" = "service$stage"."_StructureDevelopers"."B"
WHERE "User_Structure_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureOperators"."A"
FROM "service$stage"."_StructureOperators"
JOIN "service$stage"."User" AS "User_Structure_Structure_Alias" ON "User_Structure_Structure_Alias"."id" = "service$stage"."_StructureOperators"."B"
WHERE "User_Structure_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructurePlanStructures"."A"
FROM "service$stage"."_StructurePlanStructures"
WHERE "service$stage"."_StructurePlanStructures"."B" IN
(SELECT "service$stage"."_StructurePlanMissionPlan"."B"
FROM "service$stage"."_StructurePlanMissionPlan"
WHERE "service$stage"."_StructurePlanMissionPlan"."A" IN
(SELECT "service$stage"."Mission"."plan"
FROM "service$stage"."Mission"
JOIN "service$stage"."Mission" AS "Mission_MissionPlan_StructurePlan_Structure_Structure_Alias" ON "Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" = "service$stage"."Mission"."id"
WHERE ("Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionOperator"."A"
FROM "service$stage"."_MissionOperator"
JOIN "service$stage"."User" AS "User_Mission_MissionPlan_StructurePlan_Structure_Structure_Alias" ON "User_Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" = "service$stage"."_MissionOperator"."B"
WHERE "User_Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionClients"."A"
FROM "service$stage"."_MissionClients"
JOIN "service$stage"."User" AS "User_Mission_MissionPlan_StructurePlan_Structure_Structure_Alias" ON "User_Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" = "service$stage"."_MissionClients"."B"
WHERE "User_Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionInspector"."A"
FROM "service$stage"."_MissionInspector"
JOIN "service$stage"."User" AS "User_Mission_MissionPlan_StructurePlan_Structure_Structure_Alias" ON "User_Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" = "service$stage"."_MissionInspector"."B"
WHERE "User_Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionExpert"."A"
FROM "service$stage"."_MissionExpert"
JOIN "service$stage"."User" AS "User_Mission_MissionPlan_StructurePlan_Structure_Structure_Alias" ON "User_Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" = "service$stage"."_MissionExpert"."B"
WHERE "User_Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" = 'cjvy026t7515i07463lkm5n32' )) ) ) ) ) ))
AND "Alias"."id" IN
(SELECT "service$stage"."Structure"."id"
FROM "service$stage"."Structure"
JOIN "service$stage"."StructureModel" AS "StructureModel_Alias" ON "StructureModel_Alias"."id" = "service$stage"."Structure"."model"
WHERE "StructureModel_Alias"."type" IN ('WindTurbine',
'HighVoltagePowerLinePylon',
'MediumVoltagePowerLinePylon',
'Fence') ))
ORDER BY "Alias"."id" ASC
OFFSET 0 And here is the same query, after I performed the optimization of removing useless joins, which runs under 1 sec: SELECT "Alias"."id"
FROM "service$stage"."Structure" AS "Alias"
WHERE (("Alias"."id" IN
(SELECT "service$stage"."Structure"."id"
FROM "service$stage"."Structure"
WHERE "service$stage"."Structure"."organization" IN
(SELECT "service$stage"."_OrganizationUsers"."A"
FROM "service$stage"."_OrganizationUsers"
WHERE "service$stage"."_OrganizationUsers"."B" = 'cjvy026t7515i07463lkm5n32' ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureOwners"."A"
FROM "service$stage"."_StructureOwners"
WHERE "service$stage"."_StructureOwners"."B" = 'cjvy026t7515i07463lkm5n32' )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureDevelopers"."A"
FROM "service$stage"."_StructureDevelopers"
WHERE "service$stage"."_StructureDevelopers"."B" = 'cjvy026t7515i07463lkm5n32' )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureOperators"."A"
FROM "service$stage"."_StructureOperators"
WHERE "service$stage"."_StructureOperators"."B" = 'cjvy026t7515i07463lkm5n32' )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructurePlanStructures"."A"
FROM "service$stage"."_StructurePlanStructures"
WHERE "service$stage"."_StructurePlanStructures"."B" IN
(SELECT "service$stage"."_StructurePlanMissionPlan"."B"
FROM "service$stage"."_StructurePlanMissionPlan"
WHERE "service$stage"."_StructurePlanMissionPlan"."A" IN
(SELECT "service$stage"."Mission"."plan"
FROM "service$stage"."Mission"
JOIN "service$stage"."Mission" AS "Mission_MissionPlan_StructurePlan_Alias" ON "Mission_MissionPlan_StructurePlan_Alias"."id" = "service$stage"."Mission"."id"
WHERE ("Mission_MissionPlan_StructurePlan_Alias"."id" IN
(SELECT "service$stage"."_MissionOperator"."A"
FROM "service$stage"."_MissionOperator"
WHERE "service$stage"."_MissionOperator"."B" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Alias"."id" IN
(SELECT "service$stage"."_MissionClients"."A"
FROM "service$stage"."_MissionClients"
WHERE "service$stage"."_MissionClients"."B" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Alias"."id" IN
(SELECT "service$stage"."_MissionInspector"."A"
FROM "service$stage"."_MissionInspector"
WHERE "service$stage"."_MissionInspector"."B" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Alias"."id" IN
(SELECT "service$stage"."_MissionExpert"."A"
FROM "service$stage"."_MissionExpert"
WHERE "service$stage"."_MissionExpert"."B" = 'cjvy026t7515i07463lkm5n32' )) ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."Structure"."id"
FROM "service$stage"."Structure"
WHERE "service$stage"."Structure"."organization" IN
(SELECT "service$stage"."_OrganizationUsers"."A"
FROM "service$stage"."_OrganizationUsers"
WHERE "service$stage"."_OrganizationUsers"."B" = 'cjvy026t7515i07463lkm5n32' ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureOwners"."A"
FROM "service$stage"."_StructureOwners"
WHERE "service$stage"."_StructureOwners"."B" = 'cjvy026t7515i07463lkm5n32' ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureDevelopers"."A"
FROM "service$stage"."_StructureDevelopers"
WHERE "service$stage"."_StructureDevelopers"."B" = 'cjvy026t7515i07463lkm5n32' ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureOperators"."A"
FROM "service$stage"."_StructureOperators"
WHERE "service$stage"."_StructureOperators"."B" = 'cjvy026t7515i07463lkm5n32' ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructurePlanStructures"."A"
FROM "service$stage"."_StructurePlanStructures"
WHERE "service$stage"."_StructurePlanStructures"."B" IN
(SELECT "service$stage"."_StructurePlanMissionPlan"."B"
FROM "service$stage"."_StructurePlanMissionPlan"
WHERE "service$stage"."_StructurePlanMissionPlan"."A" IN
(SELECT "service$stage"."Mission"."plan"
FROM "service$stage"."Mission"
JOIN "service$stage"."Mission" AS "Mission_MissionPlan_StructurePlan_Structure_Alias" ON "Mission_MissionPlan_StructurePlan_Structure_Alias"."id" = "service$stage"."Mission"."id"
WHERE ("Mission_MissionPlan_StructurePlan_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionOperator"."A"
FROM "service$stage"."_MissionOperator"
WHERE "service$stage"."_MissionOperator"."B" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionClients"."A"
FROM "service$stage"."_MissionClients"
WHERE "service$stage"."_MissionClients"."B" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionInspector"."A"
FROM "service$stage"."_MissionInspector"
WHERE "service$stage"."_MissionInspector"."B" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionExpert"."A"
FROM "service$stage"."_MissionExpert"
WHERE "service$stage"."_MissionExpert"."B" = 'cjvy026t7515i07463lkm5n32' )) ) ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."Structure"."id"
FROM "service$stage"."Structure"
WHERE "service$stage"."Structure"."organization" IN
(SELECT "service$stage"."_OrganizationUsers"."A"
FROM "service$stage"."_OrganizationUsers"
WHERE "service$stage"."_OrganizationUsers"."B" = 'cjvy026t7515i07463lkm5n32' ) ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureOwners"."A"
FROM "service$stage"."_StructureOwners"
WHERE "service$stage"."_StructureOwners"."B" = 'cjvy026t7515i07463lkm5n32' ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureDevelopers"."A"
FROM "service$stage"."_StructureDevelopers"
WHERE "service$stage"."_StructureDevelopers"."B" = 'cjvy026t7515i07463lkm5n32' ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureOperators"."A"
FROM "service$stage"."_StructureOperators"
WHERE "service$stage"."_StructureOperators"."B" = 'cjvy026t7515i07463lkm5n32' ) ) )
OR "Alias"."id" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructureChildren"."B"
FROM "service$stage"."_StructureChildren"
WHERE "service$stage"."_StructureChildren"."A" IN
(SELECT "service$stage"."_StructurePlanStructures"."A"
FROM "service$stage"."_StructurePlanStructures"
WHERE "service$stage"."_StructurePlanStructures"."B" IN
(SELECT "service$stage"."_StructurePlanMissionPlan"."B"
FROM "service$stage"."_StructurePlanMissionPlan"
WHERE "service$stage"."_StructurePlanMissionPlan"."A" IN
(SELECT "service$stage"."Mission"."plan"
FROM "service$stage"."Mission"
JOIN "service$stage"."Mission" AS "Mission_MissionPlan_StructurePlan_Structure_Structure_Alias" ON "Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" = "service$stage"."Mission"."id"
WHERE ("Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionOperator"."A"
FROM "service$stage"."_MissionOperator"
WHERE "service$stage"."_MissionOperator"."B" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionClients"."A"
FROM "service$stage"."_MissionClients"
WHERE "service$stage"."_MissionClients"."B" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionInspector"."A"
FROM "service$stage"."_MissionInspector"
WHERE "service$stage"."_MissionInspector"."B" = 'cjvy026t7515i07463lkm5n32' )
OR "Mission_MissionPlan_StructurePlan_Structure_Structure_Alias"."id" IN
(SELECT "service$stage"."_MissionExpert"."A"
FROM "service$stage"."_MissionExpert"
WHERE "service$stage"."_MissionExpert"."B" = 'cjvy026t7515i07463lkm5n32' )) ) ) ) ) ))
AND "Alias"."id" IN
(SELECT "service$stage"."Structure"."id"
FROM "service$stage"."Structure"
JOIN "service$stage"."StructureModel" AS "StructureModel_Alias" ON "StructureModel_Alias"."id" = "service$stage"."Structure"."model"
AND "StructureModel_Alias"."type" IN ('WindTurbine',
'HighVoltagePowerLinePylon',
'MediumVoltagePowerLinePylon',
'Fence') ))
ORDER BY "Alias"."id" ASC
OFFSET 0 Is there any way I could help to bring this improvment on prisma 1 version ? |
😱 This is a 300x+ performance improvement that can be solved with just a few lines of code... Might be worth fixing now even if Prisma v2 is coming: not everyone is going to migrate to v2 tomorrow. |
Just seen #4754, which seems to partially match the case I explained above |
@mavilein @pantharshit00 I'm looking for a way to improve the problem stated above, could you just tell me if I'm looking in the right direction with the following function https://github.com/prisma/prisma/blob/250243b42c39799b5c361fba29518a030e4a9440/server/connectors/api-connector-jdbc/src/main/scala/com/prisma/api/connector/jdbc/database/FilterConditionBuilder.scala#L79-L114 ? thx |
@juliendangers : That looks like the right direction. |
Same problem here, adding few inner objects to prisma query leads to a dramatic increase on query execution time. Would have been cool to see any ideas on possible workaround while a robust solution is on its way |
Hello, We created a patch on our fork of Prisma, which in most case prevent a useless join on nested filter when we only check for the id, which is available in the relation table. It does the job for our use cases, so if it can help some of you, please have a look at sterblue#1 FYI, it does not cover all operators on ids, we only implemented the one we needed (contains is missing for example). It produces the query I was hoping for in my comment above prisma/prisma#4744 (comment) Not sure we'll create an official PR, since the energy has been redirected to Prisma v2. But if anyone in Prisma team is willing to spend some time on it, we'd be happy to help ! |
is that fixed? |
@hosmanoglu prisma1 is not maintained anymore, see 4898 |
i use "prisma": "^3.9.0". its still run 2 select instead of join . its realy bad performance |
The join already happens when we use relations on the where condition. I don't know the source code but maybe some work is already done. |
Kinda related. I've created a repo with a reproducible error because of a huge query generated instead of a join here: |
that's what i am talking about. its been a long time so i couldn't give spesific example. |
I think you should open an issue on the actual prima repo, or look for performance related issues on the prisma repo. This project is not maintained. |
wait is that really prisma1 repo :D i didnt know that :D but really thans to answer me i appreciate that |
Not sure if you did but you should open an issue in https://github.com/prisma/prisma/issues (this is prisma 1). |
@Hebilicious Oh yes I did. This is still something from prisma1 so left a comment also here. |
Is your feature request related to a problem? Please describe.
I'm working on a large-ish IOT project with a non trivial amount of data. The project uses Prisma as a DAL on AWS Fargate, with an Aurora (Postgres) database. I've noticed that for some of the data retrieval needs of the project, I had to fallback to raw SQL for performance reasons. Some of the queries that I try to do with the prisma client end up crashing the Prisma server without returning any data.
Describe the solution you'd like
I would like a way to retrieve data from different tables (call it relationships or join) using Prisma or Prisma2 (which I haven't tried for this project yet) in an efficient way, one that doesn't crash the server and doesn't take more than 30s to run.
Describe alternatives you've considered
Raw SQL/ Low level tools (knex,pg) which defeats the point a little.
In a graphQL server context, Overriding resolvers provided by nexus-prisma.
Additional context
I'll provide as much information as I'm allowed to.
This is a simplified version of the datastructure. The missing fields are mostly strings and irrelevant to the issue, and each table has createdAt and updatedAt fields defined in the datamodel.
Two of those tables are 'growing',
deviceUpdate
andsensorUpdate
, they get a considerable amount of new entries regularly.The
device
table is expected to have on average thousands of entries (will scale up to 50000 entries).On average each device makes 10 updates a day, so the
deviceUpdate
table roughly grows by the number of devices * 10 every day.The
sensorUpdate
table is between 1 and 5 times the size of the DeviceUpdate.The
sensor
table is roughly a hundred entries.The type of queries that i’m trying to run looks like this :
with potentially more query parameters, such as filtering and ordering.
This type of queries takes ages to complete, and very often they end up crashing the prisma server in most cases.
The data retrieval can be expressed with the following SQL queries :
Very slow query (minutes):
But the same result can be achieved in a much more performant way.
Fast query (seconds) :
I'm sure it's possible to write a more performant SQL query, or maybe to play around with indexes to achieve desired performances. But I don't see a way to do that with Prisma.
The text was updated successfully, but these errors were encountered: