[PATCH 01/11] Improve patch listing performance (~3x)

Daniel Axtens dja at axtens.net
Sat Aug 11 04:28:14 AEST 2018


Stewart Smith <stewart at linux.ibm.com> writes:

> There's two main bits that are really expensive when composing the list
> of patches for a project: the query getting the list, and the query
> finding the series for each patch.
>
> If we look at the query getting the list, it gets a lot of unnesseccary
> fields such as 'headers' and 'content', even though we tell Django not
> to. It turns out that Django seems to ignore the Submission relationship
> and I have no idea how to force it to ignore that thing (defer doesn't
> work) but if we go only, then it works okay.
>
> From my import of ~8000 messages for a few projects, my laptop query
> time (MySQL, as setup by whatever the docker-compose things do) goes
> from:
>
> http://localhost:8000/project/linux-kernel/list/
> FROM:
> 342ms SQL queries cold cache, 268ms warm cache
> TO:
> 118ms SQL queries cold cache, 88ms warm cache
>
> Which is... non trivial to say the least.
>
> The big jump is the patches.only change, and the removal of ordering
> on the patchseries takes a further 10ms off. For some strange reason, it
> seems rather hard to tell Django that you don't care what order the
> results come back in for that query (if we do, then the db server has to
> do a sort rather than just return each row)

Thanks Stewart! It's great to get some real DB experience - feel free to
hang around! :)

So, further to our conversation with Konstantin, I tested this against
Django 2.0. It still saves us some time - it means we no longer load the
following fields:

`patchwork_submission`.`id`, `patchwork_submission`.`msgid`,
`patchwork_patch`.`commit_ref`, `patchwork_patch`.`pull_url`,
`patchwork_patch`.`archived`, `patchwork_patch`.`hash`,
`patchwork_patch`.`patch_project_id`, 

This obviously saves the db some work and communication overhead.

I'm a little nervous that this will slightly complicate some of the
further denormalisation but I think that's probably a price worth paying
unless Stephen objects.

I do still want to test the 'ordering' change a bit more before
committing it though.

Regards,
Daniel
>
> Signed-off-by: Stewart Smith <stewart at linux.ibm.com>
> ---
>  patchwork/models.py         | 1 -
>  patchwork/views/__init__.py | 2 ++
>  2 files changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/patchwork/models.py b/patchwork/models.py
> index 6268f5b72e3c..d2b88fc48c91 100644
> --- a/patchwork/models.py
> +++ b/patchwork/models.py
> @@ -747,7 +747,6 @@ class Series(FilenameMixin, models.Model):
>          return self.name if self.name else 'Untitled series #%d' % self.id
>  
>      class Meta:
> -        ordering = ('date',)
>          verbose_name_plural = 'Series'
>  
>  
> diff --git a/patchwork/views/__init__.py b/patchwork/views/__init__.py
> index f8d23a388ac7..96fd0798af5a 100644
> --- a/patchwork/views/__init__.py
> +++ b/patchwork/views/__init__.py
> @@ -287,6 +287,8 @@ def generic_list(request, project, view, view_args=None, filter_settings=None,
>      # rendering the list template
>      patches = patches.select_related('state', 'submitter', 'delegate')
>  
> +    patches = patches.only('state','submitter','delegate','project','name','date')
> +
>      # we also need checks and series
>      patches = patches.prefetch_related('check_set', 'series')
>  
> -- 
> 2.17.1
>
> _______________________________________________
> Patchwork mailing list
> Patchwork at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/patchwork


More information about the Patchwork mailing list