diff --git a/CHANGELOG b/CHANGELOG
index 6a87e091940752620faf71bbd53b8b8d51d9a175..84e755e4ead7fd8f0ad5366b89a95030534fd190 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -30,6 +30,7 @@ v 8.9.0 (unreleased)
   - Add Application Setting to configure Container Registry token expire delay (default 5min)
   - Cache assigned issue and merge request counts in sidebar nav
   - Cache project build count in sidebar nav
+  - Reduce number of queries needed to render issue labels in the sidebar
 
 v 8.8.3
   - Fix incorrect links on pipeline page when merge request created from fork
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index 50f5b749e38745bc668b8d66a82b0519c466ebf4..e86d5236abbe806071d4f6000126572d65605f9b 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -213,6 +213,10 @@ module Issuable
     hook_data
   end
 
+  def labels_array
+    labels.to_a
+  end
+
   def label_names
     labels.order('title ASC').pluck(:title)
   end
diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml
index c1eec4501933c426f7cd249cf8344811bbe1e1ff..d6552ae7f189a3c52aaf645fa457efdb8e2bfad7 100644
--- a/app/views/shared/issuable/_sidebar.html.haml
+++ b/app/views/shared/issuable/_sidebar.html.haml
@@ -114,20 +114,20 @@
           .sidebar-collapsed-icon
             = icon('tags')
             %span
-              = issuable.labels.count
+              = issuable.labels_array.size
           .title.hide-collapsed
             Labels
             = icon('spinner spin', class: 'block-loading')
             - if can_edit_issuable
               = link_to 'Edit', '#', class: 'edit-link pull-right'
-          .value.bold.issuable-show-labels.hide-collapsed{ class: ("has-labels" if issuable.labels.any?) }
-            - if issuable.labels.any?
-              - issuable.labels.each do |label|
+          .value.bold.issuable-show-labels.hide-collapsed{ class: ("has-labels" if issuable.labels_array.any?) }
+            - if issuable.labels_array.any?
+              - issuable.labels_array.each do |label|
                 = link_to_label(label, type: issuable.to_ability_name)
             - else
               .light None
           .selectbox.hide-collapsed
-            - issuable.labels.each do |label|
+            - issuable.labels_array.each do |label|
               = hidden_field_tag "#{issuable.to_ability_name}[label_names][]", label.id, id: nil
             .dropdown
               %button.dropdown-menu-toggle.js-label-select.js-multiselect{type: "button", data: {toggle: "dropdown", field_name: "#{issuable.to_ability_name}[label_names][]", ability_name: issuable.to_ability_name, show_no: "true", show_any: "true", project_id: (@project.id if @project), issue_update: issuable_json_path(issuable), labels: (namespace_project_labels_path(@project.namespace, @project, :json) if @project)}}
diff --git a/spec/models/concerns/issuable_spec.rb b/spec/models/concerns/issuable_spec.rb
index fb20578d8d3cb9a9a55afb8d8b3e34bfc30152f6..e9f827e9f501ac20160fd4b6b045020bf79d166f 100644
--- a/spec/models/concerns/issuable_spec.rb
+++ b/spec/models/concerns/issuable_spec.rb
@@ -227,6 +227,20 @@ describe Issue, "Issuable" do
     end
   end
 
+  describe '#labels_array' do
+    let(:project) { create(:project) }
+    let(:bug) { create(:label, project: project, title: 'bug') }
+    let(:issue) { create(:issue, project: project) }
+
+    before(:each) do
+      issue.labels << bug
+    end
+
+    it 'loads the association and returns it as an array' do
+      expect(issue.reload.labels_array).to eq([bug])
+    end
+  end
+
   describe "votes" do
     let(:project) { issue.project }