Project

General

Profile

Actions

Patch #43203

open

Reduce queries at Project#remove_inherited_member_roles

Added by Kenta Kumojima 2 days ago.

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

Also available in: Atom PDF