Project

General

Profile

Actions

Bug #39335

open

N+1 queries when authorizer loads filters, filterings and permissions

Added by Adam Ruzicka 3 months ago.

Status:
New
Priority:
Normal
Assignee:
Category:
-
Target version:
-
Difficulty:
Triaged:
No
Fixed in Releases:
Found in Releases:

Description

Steps to reproduce:
1. Have a non-admin user (admins skip authorization entirely via return all if user.admin?)
2. Give the user multiple roles with filters granting permissions on the same resource type (e.g. several roles each with view_job_templates on JobTemplate)
3. Call .authorized(<permission_name>) on that resource — the authorizer loads all matching filters, then iterates them

The count scales with the number of matching filters, so more roles with overlapping permissions on the same resource = more N+1 queries.

> JobTemplate.authorized(:view_job_templates)
-----B<-----SNIP-----B<-----
2026-05-19T15:16:33 [D|per|] filter with role_id: 17 limited: false search:  taxonomy_search:
 | filter with role_id: 18 limited: false search:  taxonomy_search:
 | filter with role_id: 2 limited: false search:  taxonomy_search:
 | filter with role_id: 3 limited: false search:  taxonomy_search:
 | filter with role_id: 8 limited: false search:  taxonomy_search:
 | filter with role_id: 9 limited: false search:  taxonomy_search:
 | filter with role_id: 21 limited: false search:  taxonomy_search:
2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.4ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 230], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Permission Load (0.4ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.3ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 230], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Permission Load (0.3ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.4ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 237], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Permission Load (0.3ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.4ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 237], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Permission Load (0.3ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.4ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 241], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Permission Load (0.3ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.3ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 241], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Permission Load (0.3ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.3ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 245], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Permission Load (0.3ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.3ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 245], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Permission Load (0.3ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.3ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 249], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Permission Load (0.3ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.3ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 249], ["LIMIT", 1]]
2026-05-19T15:16:33 [D|sql|]   Permission Load (0.3ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]                                                                                                                  2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.3ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 253], ["LIMIT", 1]]                                                                         2026-05-19T15:16:33 [D|sql|]   Permission Load (0.3ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]                                                                                                                  2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.4ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 253], ["LIMIT", 1]]                                                                         2026-05-19T15:16:33 [D|sql|]   Permission Load (0.3ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]                                                                                                                  2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.3ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 265], ["LIMIT", 1]]                                                                         2026-05-19T15:16:33 [D|sql|]   Permission Load (0.3ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]                                                                                                                  2026-05-19T15:16:33 [D|sql|]   Filtering Load (0.3ms)  SELECT "filterings".* FROM "filterings" WHERE "filterings"."filter_id" = $1 ORDER BY "filterings"."id" ASC LIMIT $2  [["filter_id", 265], ["LIMIT", 1]]                                                                         2026-05-19T15:16:33 [D|sql|]   Permission Load (0.3ms)  SELECT "permissions".* FROM "permissions" WHERE "permissions"."id" = $1 LIMIT $2  [["id", 169], ["LIMIT", 1]]
-----B<-----SNIP-----B<-----

No data to display

Actions

Also available in: Atom PDF