Commit ef253a1e authored by Stan Hu's avatar Stan Hu

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.
parent 37a7b590
---
title: Eliminate cached N+1 queries for projects in Issue API
merge_request:
author:
type: performance
...@@ -16,7 +16,7 @@ module API ...@@ -16,7 +16,7 @@ module API
args[:scope] = args[:scope].underscore if args[:scope] args[:scope] = args[:scope].underscore if args[:scope]
issues = IssuesFinder.new(current_user, args).execute 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]) issues.reorder(args[:order_by] => args[:sort])
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment