Development #68212
LingoRecentTransactionsCell: optimisation SQL
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
Historique
Mis à jour par Pierre Ducroquet il y a plus d'un an
- Fichier 0001-LingoRecentTransactionsCell-optimize-query-68212.patch 0001-LingoRecentTransactionsCell-optimize-query-68212.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
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...
Mis à jour par A. Berriot il y a plus d'un an
- Statut changé de Solution proposée à Solution validée
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
Mis à jour par Transition automatique il y a plus d'un an
- Statut changé de Résolu (à déployer) à Solution déployée
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