Actions
Patch #43203
openReduce queries at Project#remove_inherited_member_roles
Status:
New
Priority:
Normal
Assignee:
-
Category:
Performance
Target version:
-
Start date:
Due date:
% Done:
0%
Estimated time:
Description
When parent project has many members, clearing the parent_id of project that inherit_members is true takes a very long time.
Project#remove_inherited_member_roles runs many DELETE queries.
... ↳ app/models/project.rb:1044:in 'block in Project#remove_inherited_member_roles' Member Load (3.9ms) SELECT `members`.* FROM `members` WHERE `members`.`id` = 4048 LIMIT 1 ↳ app/models/member_role.rb:55:in 'MemberRole#remove_member_if_empty' Role Load (4.5ms) SELECT DISTINCT `roles`.* FROM `roles` INNER JOIN `member_roles` ON `roles`.`id` = `member_roles`.`role_id` WHERE `member_roles`.`member_id` = 4048 ↳ app/models/member_role.rb:55:in 'MemberRole#remove_member_if_empty' MemberRole Load (5.1ms) SELECT `member_roles`.* FROM `member_roles` WHERE `member_roles`.`member_id` = 4048 ↳ app/models/member.rb:147:in 'Member#destroy' IssueCategory Update All (4.0ms) UPDATE `issue_categories` SET assigned_to_id = NULL WHERE (project_id = '1435' AND assigned_to_id = '10') ↳ app/models/member.rb:165:in 'Member#set_issue_category_nil' Project Load (5.1ms) SELECT `projects`.* FROM `projects` WHERE `projects`.`id` = 1435 LIMIT 1 ↳ app/models/member.rb:170:in 'Member#remove_from_project_default_assigned_to' Member Destroy (4.9ms) DELETE FROM `members` WHERE `members`.`id` = 4048 ↳ app/models/member.rb:148:in 'Member#destroy' MemberRole Load (4.1ms) SELECT `member_roles`.* FROM `member_roles` WHERE `member_roles`.`inherited_from` = 4053 ↳ app/models/member_role.rb:81:in 'MemberRole#remove_inherited_roles' MemberRole Destroy (3.7ms) DELETE FROM `member_roles` WHERE `member_roles`.`id` = 4054 ↳ app/models/member_role.rb:81:in 'MemberRole#remove_inherited_roles' Member Load (3.4ms) SELECT `members`.* FROM `members` WHERE `members`.`id` = 4049 LIMIT 1 ↳ app/models/member_role.rb:55:in 'MemberRole#remove_member_if_empty' Role Load (4.2ms) SELECT DISTINCT `roles`.* FROM `roles` INNER JOIN `member_roles` ON `roles`.`id` = `member_roles`.`role_id` WHERE `member_roles`.`member_id` = 4049 ↳ app/models/member_role.rb:55:in 'MemberRole#remove_member_if_empty' MemberRole Load (3.1ms) SELECT `member_roles`.* FROM `member_roles` WHERE `member_roles`.`member_id` = 4049 ↳ app/models/member.rb:147:in 'Member#destroy' IssueCategory Update All (2.9ms) UPDATE `issue_categories` SET assigned_to_id = NULL WHERE (project_id = '1436' AND assigned_to_id = '10') ↳ app/models/member.rb:165:in 'Member#set_issue_category_nil' Project Load (3.7ms) SELECT `projects`.* FROM `projects` WHERE `projects`.`id` = 1436 LIMIT 1 ↳ app/models/member.rb:170:in 'Member#remove_from_project_default_assigned_to' Member Destroy (3.6ms) DELETE FROM `members` WHERE `members`.`id` = 4049 ↳ app/models/member.rb:148:in 'Member#destroy' MemberRole Load (1.9ms) SELECT `member_roles`.* FROM `member_roles` WHERE `member_roles`.`inherited_from` = 4054 ↳ app/models/member_role.rb:81:in 'MemberRole#remove_inherited_roles' MemberRole Destroy (3.5ms) DELETE FROM `member_roles` WHERE `member_roles`.`id` = 4055 ↳ app/models/member_role.rb:81:in 'MemberRole#remove_inherited_roles' Member Load (8.2ms) SELECT `members`.* FROM `members` WHERE `members`.`id` = 4050 LIMIT 1 ↳ app/models/member_role.rb:55:in 'MemberRole#remove_member_if_empty' Role Load (4.0ms) SELECT DISTINCT `roles`.* FROM `roles` INNER JOIN `member_roles` ON `roles`.`id` = `member_roles`.`role_id` WHERE `member_roles`.`member_id` = 4050 ↳ app/models/member_role.rb:55:in 'MemberRole#remove_member_if_empty' MemberRole Load (4.7ms) SELECT `member_roles`.* FROM `member_roles` WHERE `member_roles`.`member_id` = 4050 ...
I wrote a patch to reduce the number of DELETE queries.
Measurement was performed under the following conditions:
MyProject0 > MyProject1 > MyProject2 > MyProject3
MyProject0: root project. it has 100 members.
MyProject1: parent is MyProject0. inherit_members is true.
MyProject2: parent is MyProject1. inherit_members is true.
MyProject3: parent is MyProject2. inherit_members is true.
I try to update parent_id of MyProject1 to nil.
before apply patch
Started PATCH "/projects/myproject1" for 192.168.23.1 at 2025-09-12 18:17:31 +0900 Processing by ProjectsController#update as HTML ... Completed 302 Found in 48386ms (ActiveRecord: 15672.7ms (2424 queries, 0 cached) | GC: 1073.5ms)
after apply patch
Started PATCH "/projects/myproject1" for 192.168.23.1 at 2025-09-12 18:12:17 +0900 Processing by ProjectsController#update as HTML ... Completed 302 Found in 3035ms (ActiveRecord: 2145.7ms (52 queries, 0 cached) | GC: 70.9ms)
Files
No data to display
Actions