J'ai une requête simple (PostGreSQL si cela importe) que tous les éléments récupère pour un_utilisateur sauf ceux qu'elle a sur sa liste:requête lente avec jointure externe gauche et est la condition null
select i.*
from core_item i
left outer join core_item_in_basket b on (i.id=b.item_id and b.user_id=__some_user__)
where b.on_wishlist is null;
La requête ci-dessus s'exécute en ~ 50000ms (oui, le nombre est correct). Si je supprime la condition "b.on_wishlist is null" ou la rende "b.on_wishlist n'est pas nulle", la requête s'exécutera en 50 ms (un changement assez important).
La requête a plus de jointures et de conditions, mais ce n'est pas pertinent car seul celui-ci le ralentit.
Quelques informations sur la taille de la base de données:
- core_items a ~ 10.000 dossiers
- core_user a ~ 5.000 dossiers
- core_item_in_basket a ~ 2.000
- records (dont environ 50% a on_wishlist = true, le reste est null)
Je n'ai aucun index (sauf pour les IDs et les clés étrangères) sur ces deux tables.
La question est: que dois-je faire pour que cette exécution plus rapide? J'ai moi-même quelques idées à découvrir ce soir, mais j'aimerais aussi que vous aidiez, si possible.
Merci!
peut-être que vous pourriez regarder l'exécution des plans pour voir quel est le problème. En théorie, les requêtes 'nul' ou 'non nul' doivent avoir le même plan d'exécution si le solde est de 50/50. Les statistiques statiques pour la table doivent être fausses! –
@ Scorpi0 pas tout à fait. Rappelez-vous que ceci est une jointure externe. Les statistiques nulles pour core_item_in_basket sont en effet 50/50, mais la requête essaie de faire correspondre chaque enregistrement de core_item avec un enregistrement de core_item_in_basket, produisant beaucoup de nulls supplémentaires sur le côté droit de la jointure. – michuk
Deux types de ligne correspondent à la condition "où b.on_wishlist est nulle" 1. Rows dans core_item sans les correspondants dans core_item_in_basket; 2. Les lignes dans core_item qui ont des correspondants dans core_item_in_basket, mais certaines de ces correspondances correspondent à on_wishlist est nulle Voulez-vous les deux groupes de lignes? –