Eliminate cached N+1 queries for projects in Issue API
In CE, every `Issue` entity is also a `ProjectEntity`, which calls `entity&.project.try(:id)` to show the project ID. In an API request with 100 issues, this would hit the Rails statement cache 100 times for the same project and cause unnecessary overhead as related models would also be loaded. In EE, we call `Issue#supports_weight?` for each issue, which then calls `project&.feature_available?(:issue_weights)`. If the project is not preloaded, this incurs additional overhead, as each individual Project object has to be queried. This can lead to a significant performance hit. In loading the CE project with 100 issues, this contributed to at least 22% of the load time. See https://gitlab.com/gitlab-org/gitlab-ce/issues/47031 for why testing this is a bit tricky.
This commit is contained in:
parent
37a7b590c6
commit
ef253a1ee7
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
title: Eliminate cached N+1 queries for projects in Issue API
|
||||
merge_request:
|
||||
author:
|
||||
type: performance
|
|
@ -16,7 +16,7 @@ module API
|
|||
args[:scope] = args[:scope].underscore if args[:scope]
|
||||
|
||||
issues = IssuesFinder.new(current_user, args).execute
|
||||
.preload(:assignees, :labels, :notes, :timelogs)
|
||||
.preload(:assignees, :labels, :notes, :timelogs, :project)
|
||||
|
||||
issues.reorder(args[:order_by] => args[:sort])
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue