2017-06-02 1 views
1

J'apprends Django et sa méthodologie d'accès aux données ORM et il y a quelque chose que je suis curieux. Dans un point final particulier, je fais un certain nombre d'appels de base de données (à Postgres) - ci-dessous est un exemple de:Django QuerySet vs considérations de performance SQL brut

projects = Project.objects\ 
      .filter(Q(first_appointment_scheduled=True) | (Q(active=True) & Q(phase=ProjectPhase.meet.value)))\ 
      .select_related('customer__first_name', 'customer__last_name', 
          'lead_designer__user__first_name', 'lead_designer__user__last_name')\ 
      .values('id')\ 
      .annotate(project=F('name'), 
         buyer=Concat(F('customer__first_name'), Value(' '), F('customer__last_name')), 
         designer=Concat(F('lead_designer__user__first_name'), Value(' '), F('lead_designer__user__last_name')), 
         created=F('created_at'), 
         meeting=F('first_appointment_date'))\ 
      .order_by('id')[:QUERY_SIZE] 

Comme vous pouvez le voir, ce n'est pas une petite question - je tire dans un beaucoup de données spécifiques et connexes et de manipulation de chaînes. Je suis relativement préoccupé par les performances, donc je fais de mon mieux pour rendre les choses plus efficaces en utilisant select_related() et values() pour obtenir exactement ce dont j'ai besoin. La question que j'ai est, conceptuellement et en termes généraux, à quel point il devient plus rapide d'écrire mes requêtes en utilisant SQL paramétré au lieu d'utiliser l'ORM (puisque l'ORM doit d'abord "traduire" le désordre ci-dessus ")? À quel niveau approximatif de complexité des requêtes dois-je passer au SQL brut?

Un aperçu serait utile. Merci!

Répondre

3

La question que j'est, sur le plan conceptuel et en termes généraux, à quel point devient-il plus rapide d'écrire simplement mes requêtes à l'aide SQL paramétrés au lieu d'utiliser l'ORM (depuis le ORM doit d'abord « traduire » le ci-dessus "gâchis")?

Si vous posez des questions sur la performance, Jamais.

Le temps nécessaire pour convertir la requête ORM en SQL sera très petit par rapport au temps nécessaire pour exécuter cette requête. Les tresses sont irremplaçables, les serveurs sont bon marché.

Si vous êtes vraiment préoccupé par les performances, le premier endroit à regarder est vos index. Essayez d'imprimer chacune des requêtes générées par l'ORM et exécutez-les dans votre console psql en préfixant EXPLAIN ANALYZE.

A quel niveau approximatif de la complexité des requêtes dois-je passer à SQL brut?

Si vous demandez la facilité de codage, cela dépend.

Si la requête est très très difficile à écrire en utilisant l'ORM et qu'elle est illisible, oui, alors il est parfaitement possible d'utiliser une requête brute.

1

D'accord avec ce que dit @ e4c5.

Une couche de traduction supplémentaire pour convertir une requête ORM en requête SQL brute affectera les performances.

Cependant, cet effet dépend de la complexité de votre requête. Lorsque vous utilisez ORM, vous pouvez contrôler la charge sur la base de données en augmentant le traitement dans l'application. En outre, cela donne la possibilité de mettre en cache le résultat dans l'application elle-même.

Enfin, cela dépend entièrement de votre schéma, la complexité de vos requêtes peuvent être et comment vous votre mise à l'échelle DB (indices, répliques etc.)

Pour plus lire here

+0

Bon article.Je pense que je pourrais imprimer ce diagramme. – Snowie

+0

content que vous avez aimé, s'il vous plaît upvote ma réponse si vous l'utile .. merci – tom

+0

'Couche de traduction supplémentaire pour convertir une requête ORM en requête SQL brute aura une incidence sur les performances' Si vous faites un benchmark, vous trouverez le contraire. L'effet est négligeable. – e4c5