From aada01030cd23719a54a4e499b72c12f95ce0d24 Mon Sep 17 00:00:00 2001
From: Stan Hu <stanhu@gmail.com>
Date: Thu, 6 Oct 2016 12:09:55 -0700
Subject: [PATCH] Improve issue load time performance by avoiding ORDER BY in
 find_by call

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
---
 CHANGELOG                                     | 1 +
 app/controllers/projects/issues_controller.rb | 3 ++-
 2 files changed, 3 insertions(+), 1 deletion(-)

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
-- 
GitLab