Requêtes dupliquées

a marqué ce sujet comme résolu.

Bonjour à tous,

Je gère un site qui tourne sous Django, et je vois depuis quelques temps pas mal de "requêtes dupliquées" grâce à django-debug.

Dans certains cas, ce ne des requêtes dupliquées "que" 4 fois, mais sur certaines cela peut atteindre la trentaine.

Cela m’inquiète car je pense qu’à un moment, cela posera un problème de performances (ce n’est pas encore le cas).

J’aimerais donc savoir si :

  1. Vous auriez une idée de la cause du problème
  2. Ce que je peux faire pour débugger, afin de trouver les appels fautifs, puis pour corriger

Merci d’avance ! Si vous avez besoin de morceaux de code je pourrai vous en fournir, mais le problème n’est pas spécifique, je le retrouve à plusieurs endroits.

Merci d’avance pour votre aide, et bonne journée.

Le problème des "N+1 SELECT" ?

Je ne connais pas l’ORM de Django, mais un nombre de requêtes qui explose avec un ORM, sans avoir un endroit spécifique dans le code, un nombre d’appels variables ça pourrait être ça.

Isole un cas où ça se produit et regarde (ou donne nous) :

  • ton modèle
  • la façon dont tu "sors" les objets de la BDD
  • les requêtes SQL dupliquées

Exemple :

J’ai une classe Person qui has_many Dog. Dans l’API où je renvoie la liste des profils utilisateurs, je fais (pseudo-code) :

1
2
3
4
val everyone = Persons.all()
for(user in everyone) {
  addToApiResponse(everyone.dog.name)
}

Et du coup je vois :

SELECT * from PERSON -> ça c’est bon.

Mais après je vois 50 fois :

SELECT name from CHIEN c WHERE c.master = ?


Ca ça serait typiquement un soucis de N+1 SELECT.

Mais y’a tellement d’autre possibilité que… il nous faut plus d’infos, isole un cas, on pourra travailler dessus.

+0 -0

Merci pour les liens Javier, après quelques essais fructueux cela semble être ce problème-là.

La solution semble être d’utiliser la méthode select_related(), qui permet de populer en avance les objets liés et donc d’éviter les N+1 SELECT. Après des tests sur deux méthodes différentes, je suis passé d’une quinzaine de requêtes à deux ou trois (qui sont, évidemment, plus compliquées).

Je te remercie de ton aide, je vais travailler sur ce point-là maintenant. Je laisse le sujet ouvert au cas où des problèmes liés surgiraient.

A bientôt :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte