Optimize HostList API: conditional DISTINCT + composite index on JobHostSummary (#16530)

AAP-81517 — Optimize HostList API: conditional DISTINCT + composite index

Make .distinct() conditional on host_filter being set — without it the
RBAC IN subquery on a direct FK cannot produce duplicates, so DISTINCT
is pure overhead. Add composite index (host_id, id DESC) on
main_jobhostsummary so the with_latest_summary_id() correlated subquery
can use an index-only top-1 scan instead of scanning and sorting.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dirk Julich
2026-07-06 17:01:20 +02:00
committed by GitHub
parent 72a1922a9c
commit 41545cfcf0
3 changed files with 22 additions and 1 deletions

View File

@@ -1926,7 +1926,8 @@ class HostList(HostRelatedSearchMixin, ListCreateAPIView):
if filter_string:
filter_qs = SmartFilter.query_from_string(filter_string)
qs &= filter_qs
return qs.distinct().with_latest_summary_id()
qs = qs.distinct()
return qs.with_latest_summary_id()
def list(self, *args, **kwargs):
try:

View File

@@ -0,0 +1,17 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('main', '0205_add_ordering_to_instancegroup_and_workflow_nodes'),
]
operations = [
migrations.AddIndex(
model_name='jobhostsummary',
index=models.Index(
fields=['host', '-id'],
name='main_jobhostsumm_host_id_desc',
),
),
]

View File

@@ -1092,6 +1092,9 @@ class JobHostSummary(CreatedModifiedModel):
unique_together = [('job', 'host_name')]
verbose_name_plural = _('job host summaries')
ordering = ('-pk',)
indexes = [
models.Index(fields=['host', '-id'], name='main_jobhostsumm_host_id_desc'),
]
job = models.ForeignKey(
'Job',