diff options
author | Gabriel Mazetto <brodock@gmail.com> | 2018-11-14 06:07:35 +0100 |
---|---|---|
committer | Gabriel Mazetto <brodock@gmail.com> | 2018-11-23 05:41:31 +0100 |
commit | f9b8e28e5d0b49c76a430e4b91fccd7f300321a4 (patch) | |
tree | 4163c046fd9bfb66d5cc21f3017d5e51eb420094 | |
parent | 7886ddde7ec6434a909586f60fd16ce10600c559 (diff) | |
download | gitlab-ce-fix-n-plus-1-queries-projects.tar.gz |
Reduce N+1 from Activity Dashboard and Banzaifix-n-plus-1-queries-projects
There is a combination of few strategies implemented here:
1. Few relations were eager loaded
2. Changed few polymorphic routes to specific ones so we don't have to
use `#becomes(Namespace)` which doesn't preserve association cache
-rw-r--r-- | app/helpers/events_helper.rb | 6 | ||||
-rw-r--r-- | app/helpers/projects_helper.rb | 2 | ||||
-rw-r--r-- | app/models/event.rb | 2 | ||||
-rw-r--r-- | app/models/note.rb | 2 | ||||
-rw-r--r-- | changelogs/unreleased/fix-n-plus-1-queries-projects.yml | 6 |
5 files changed, 15 insertions, 3 deletions
diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 3ce2398f1de..d5a2aa0231f 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -161,6 +161,12 @@ module EventsHelper project_commit_url(event.project, event.note_target, anchor: dom_id(event.target)) elsif event.project_snippet_note? project_snippet_url(event.project, event.note_target, anchor: dom_id(event.target)) + elsif event.issue_note? + namespace_project_issue_url(namespace_id: event.project.namespace_id, project_id: event.project_id, + id: event.note_target, anchor: dom_id(event.target)) + elsif event.merge_request_note? + namespace_project_merge_request_url(namespace_id: event.project.namespace_id, project_id: event.project_id, + id: event.note_target, anchor: dom_id(event.target)) else polymorphic_url([event.project.namespace.becomes(Namespace), event.project, event.note_target], diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 0a7f930110a..878dc01074b 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -2,7 +2,7 @@ module ProjectsHelper def link_to_project(project) - link_to [project.namespace.becomes(Namespace), project], title: h(project.name) do + link_to admin_namespace_project_path(namespace_id: project.namespace_id, id: project), title: h(project.name) do title = content_tag(:span, project.name, class: 'project-name') if project.namespace diff --git a/app/models/event.rb b/app/models/event.rb index 2e690f8c013..2ceef412af5 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -87,7 +87,7 @@ class Event < ActiveRecord::Base scope :with_associations, -> do # We're using preload for "push_event_payload" as otherwise the association # is not always available (depending on the query being built). - includes(:author, :project, project: :namespace) + includes(:author, :project, project: [:project_feature, :import_data, :namespace]) .preload(:target, :push_event_payload) end diff --git a/app/models/note.rb b/app/models/note.rb index 592efb714f3..c2fdddd8b7c 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -131,7 +131,7 @@ class Note < ActiveRecord::Base scope :with_associations, -> do # FYI noteable cannot be loaded for LegacyDiffNote for commits includes(:author, :noteable, :updated_by, - project: [:project_members, { group: [:group_members] }]) + project: [:project_members, :namespace, { group: [:group_members] }]) end scope :with_metadata, -> { includes(:system_note_metadata) } diff --git a/changelogs/unreleased/fix-n-plus-1-queries-projects.yml b/changelogs/unreleased/fix-n-plus-1-queries-projects.yml new file mode 100644 index 00000000000..cb625784267 --- /dev/null +++ b/changelogs/unreleased/fix-n-plus-1-queries-projects.yml @@ -0,0 +1,6 @@ +--- +title: Fix some N+1 queries related to Admin Dashboard, User Dashboards and Activity + Stream +merge_request: 23034 +author: +type: performance |