Reduce N+1 queries when approvals by committers are not allowed
What does this MR do and why?
Preload merge_request_diff_commits
association of each MR when mergeRequests
are queried via GraphQL.
We also need to batch load committers and lazy load the value of mergeable
and detailed_merge_status
to prevent N+1 queries for querying committers by their emails.
Query plans
- `merge_request_diff_commits`: https://console.postgres.ai/gitlab/gitlab-production-tunnel-pg12/sessions/26474/commands/82964 - `merge_request_diff_commit_users`: https://console.postgres.ai/gitlab/gitlab-production-tunnel-pg12/sessions/26474/commands/82967 - `committers`: https://console.postgres.ai/gitlab/gitlab-production-tunnel-pg12/sessions/26474/commands/82966 (still just like before but instead of querying per MR, they're batch loaded in a single query)N+1 queries I see locally
SELECT "merge_request_diff_commits".* FROM "merge_request_diff_commits"...-- (expected: 0, got: 1) WHERE "merge_request_diff_commits"."merge_request_diff_id" = 695 ORDER BY "merge_request_diff_commits"."merge_request_diff_id" ASC, "merge_request_diff_commits"."relative_order" ASC
-- (expected: 0, got: 1) WHERE "merge_request_diff_commits"."merge_request_diff_id" = 694 ORDER BY "merge_request_diff_commits"."merge_request_diff_id" ASC, "merge_request_diff_commits"."relative_order" ASC
-- (expected: 0, got: 1) WHERE "merge_request_diff_commits"."merge_request_diff_id" = 693 ORDER BY "merge_request_diff_commits"."merge_request_diff_id" ASC, "merge_request_diff_commits"."relative_order" ASC
SELECT "merge_request_diff_commit_users".* FROM "merge_request_diff_commit_users"...
-- (expected: 0, got: 1) WHERE "merge_request_diff_commit_users"."id" = 930
-- (expected: 0, got: 1) WHERE "merge_request_diff_commit_users"."id" = 929
-- (expected: 0, got: 1) WHERE "merge_request_diff_commit_users"."id" = 928
SELECT "users".* FROM ((SELECT "users".* FROM "users" WHERE (LOWER("users"."email") IN (LOWER('user34@example.org')))) UNION (SELECT "users".* FROM "users"...
-- (expected: 0, got: 1) INNER JOIN "emails" ON "emails"."user_id" = "users"."id" WHERE "emails"."email" = 'user34@example.org' AND "emails"."confirmed_at" IS NOT NULL)) users
SELECT "users".* FROM ((SELECT "users".* FROM "users" WHERE (LOWER("users"."email") IN (LOWER('user33@example.org')))) UNION (SELECT "users".* FROM "users"...
-- (expected: 0, got: 1) INNER JOIN "emails" ON "emails"."user_id" = "users"."id" WHERE "emails"."email" = 'user33@example.org' AND "emails"."confirmed_at" IS NOT NULL)) users
SELECT "users".* FROM ((SELECT "users".* FROM "users" WHERE (LOWER("users"."email") IN (LOWER('user32@example.org')))) UNION (SELECT "users".* FROM "users"...
-- (expected: 0, got: 1) INNER JOIN "emails" ON "emails"."user_id" = "users"."id" WHERE "emails"."email" = 'user32@example.org' AND "emails"."confirmed_at" IS NOT NULL)) users
MR acceptance checklist
Please evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.
Related to #441204 (closed)