Projet

Général

Profil

Development #68212

LingoRecentTransactionsCell: optimisation SQL

Ajouté par Pierre Ducroquet il y a plus d'un an. Mis à jour il y a plus d'un an.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
17 août 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

LingoRecentTransactionsCell:get_transaction_queryset a une construction particulièrement sub-optimale.

        qs = Transaction.objects.filter(models.Q(user=user) | models.Q(items__user=user)).filter(
            start_date__gte=timezone.now() - datetime.timedelta(days=7)
        )

Un "OR" entre deux champs qui ne sont pas de la même table va nécessairement conduire l'optimiseur PostgreSQL à utiliser, pour l'un ou l'autre, un ou plusieurs scans séquentiels.
Il faut proscrire ce genre de construction, et utiliser plutôt un UNION entre deux requêtes.

Par ailleurs, il est possiblement plus efficace d'avoir un index sur start_date afin de filtrer plus efficacement les transactions récentes.


Fichiers

Révisions associées

Révision 76167cab (diff)
Ajouté par Pierre Ducroquet il y a plus d'un an

LingoRecentTransactionsCell: optimize query (#68212)

- use an union instead of an OR
- use the fact that union is an implicit distinct to simplify the code
- index the start_date field so it can be used to filter efficiently

Historique

#1

Mis à jour par Pierre Ducroquet il y a plus d'un an

Sur toulouse, on divise par 5 à 10 le temps d'exécution de cette requête, et elle ne peut pas avoir un plan pire que la précédente...

#2

Mis à jour par A. Berriot il y a plus d'un an

  • Statut changé de Solution proposée à Solution validée
#3

Mis à jour par Pierre Ducroquet il y a plus d'un an

  • Statut changé de Solution validée à Résolu (à déployer)

Mergé.

commit 76167cab032445a8fd6a7701c64289b385c166df (HEAD -> main, origin/wip/68212-transactionrecentcell, origin/main, origin/HEAD, wip/68212-transactionrecentcell)
Author: Pierre Ducroquet <pducroquet@entrouvert.com>
Date:   Wed Aug 17 11:42:35 2022 +0200

    LingoRecentTransactionsCell: optimize query (#68212)

    - use an union instead of an OR
    - use the fact that union is an implicit distinct to simplify the code
    - index the start_date field so it can be used to filter efficiently

#4

Mis à jour par Transition automatique il y a plus d'un an

  • Statut changé de Résolu (à déployer) à Solution déployée
#5

Mis à jour par Transition automatique il y a plus d'un an

Automatic expiration

Formats disponibles : Atom PDF