diff options
author | Stan Hu <stanhu@gmail.com> | 2016-10-06 12:09:55 -0700 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2016-10-06 12:13:03 -0700 |
commit | aada01030cd23719a54a4e499b72c12f95ce0d24 (patch) | |
tree | cff8ffc9784c010537eb3260883074981eccd5ec | |
parent | 6320192592f32519c07231480cbd669a71e78320 (diff) | |
download | gitlab-ce-aada01030cd23719a54a4e499b72c12f95ce0d24.tar.gz |
Improve issue load time performance by avoiding ORDER BY in find_by callsh-fix-issue-perf-order-by-issue
The Sortable concern has a default scope that adds ORDER BY to all
queries. EXPLAIN ANALYZE shows that this additional ORDER BY statement
causes the SQL optimizer to use the wrong index, which leads to a load
time of 2.9 s vs 0.073 ms just for the SELECT call. The minimal
change here is to re-implement find_by using where and reorder to
remove the ORDER BY clause in IssuesController#index.
Closes #23075
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | app/controllers/projects/issues_controller.rb | 3 |
2 files changed, 3 insertions, 1 deletions
diff --git a/CHANGELOG b/CHANGELOG index 0da60766e33..52ba6036083 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,6 +3,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.13.0 (unreleased) - Update runner version only when updating contacted_at - Add link from system note to compare with previous version + - Improve issue load time performance by avoiding ORDER BY in find_by call - Use gitlab-shell v3.6.2 (GIT TRACE logging) - Fix centering of custom header logos (Ashley Dumaine) - AbstractReferenceFilter caches project_refs on RequestStore when active diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index ef13e0677d2..96041b07647 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -159,7 +159,8 @@ class Projects::IssuesController < Projects::ApplicationController protected def issue - @noteable = @issue ||= @project.issues.find_by(iid: params[:id]) || redirect_old + # The Sortable default scope causes performance issues when used with find_by + @noteable = @issue ||= @project.issues.where(iid: params[:id]).reorder(nil).take || redirect_old end alias_method :subscribable_resource, :issue alias_method :issuable, :issue |