Pourquoi le SQL paramétré généré par NHibernate est-il aussi rapide qu'une procédure stockée ?

StackOverflow https://stackoverflow.com/questions/50346

  •  09-06-2019
  •  | 
  •  

Question

Un de mes collègues affirme que même si le chemin d'exécution est mis en cache, il est impossible que le SQL paramétré généré à partir d'un ORM soit aussi rapide qu'une procédure stockée.Une aide avec ce développeur têtu ?

Était-ce utile?

Autres conseils

Round 1 - Vous pouvez démarrer une trace du profileur et comparer les temps d'exécution.

Pour la plupart des gens, la meilleure façon de les convaincre est de "leur montrer la preuve". Dans ce cas, je créerais quelques cas de test de base pour récupérer le même ensemble de données, puis le temps qu'il faut en utilisant les procédures stockées par rapport au nhibernate.Une fois que vous avez les résultats, remettez-les-leur et les personnes les plus sceptiques devraient céder aux preuves.

J'ajouterais seulement quelques éléments à la réponse de Rob :

Tout d’abord, assurez-vous que la quantité de données impliquées dans les cas de test est similaire aux valeurs de production.En d’autres termes, si vos requêtes portent normalement sur des tables contenant des centaines de milliers ou des lignes, créez un tel environnement de test.

Deuxièmement, rendez tout le reste égal, à l'exception de l'utilisation d'une requête générée par nHibernate et d'un appel s'proc.J'espère que vous pourrez exécuter le test en changeant simplement de fournisseur.

Enfin, sachez qu’il y a généralement bien plus en jeu que de simples procédures stockées par rapport à.ORM.Dans cet esprit, le test doit examiner tous les facteurs :temps d'exécution, consommation de mémoire, évolutivité, capacité de débogage, etc.

Le problème ici est que vous avez accepté le fardeau de la preuve.Il est peu probable que vous fassiez changer d’avis quelqu’un de cette façon.Qu'on le veuille ou non, les gens - même les programmeurs - sont tout simplement trop émotifs pour se laisser facilement influencer par la logique.Vous devez lui remettre la charge de la preuve – l’amener à vous convaincre du contraire – et cela l’obligera à faire des recherches et à découvrir la réponse par lui-même.

Un meilleur argument en faveur de l'utilisation de procédures stockées est la sécurité.Si tu utilises seulement procédures stockées, avec Non SQL dynamique, vous pouvez désactiver les autorisations SELECT, INSERT, UPDATE, DELETE, ALTER et CREATE pour l'utilisateur de la base de données de l'application.Cela vous protégera contre la plupart des injections SQL de deuxième ordre, alors que les requêtes paramétrées ne sont efficaces que contre les injections de premier ordre.

Mesurez-le, mais dans un référentiel non-micro, c'est-à-direquelque chose qui représente des opérations réelles dans votre système.Même s'il y avait un petit avantage en termes de performances pour une procédure stockée, il serait insignifiant par rapport aux autres coûts supportés par votre code :récupérer réellement des données, les convertir, les afficher, etc.Sans oublier qu'utiliser des procédures stockées revient à diffuser votre logique sur votre application et votre base de données sans contrôle de version significatif, tests unitaires ou prise en charge de la refactorisation dans cette dernière.

Comparez-le vous-même.Écrivez une classe de banc de test qui exécute une procédure stockée échantillonnée plusieurs centaines de fois et exécutez le code NHibernate le même nombre de fois.Comparez le temps d'exécution moyen et médian de chaque méthode.

C'est tout aussi rapide si la requête est la même à chaque fois.SQL Server 2005 met en cache les plans de requête au niveau de chaque instruction d'un lot, quelle que soit la provenance du SQL.

La différence à long terme pourrait être que les procédures stockées sont bien plus faciles à gérer et à régler pour un administrateur de base de données, alors que des centaines de requêtes différentes qui doivent être glanées à partir des traces du profileur sont un cauchemar.

J'ai eu cet argument à plusieurs reprises.
Presque toujours, je finis par prendre un très bon dba, et exécuter un processus et un morceau de code avec le profileur en cours d'exécution, et faire en sorte que le dba montre que les résultats sont si proches que c'est négligeable.

Mesure le.

En réalité, toute discussion sur ce sujet est probablement futile tant que vous ne l'avez pas mesuré.

Il a peut-être raison pour le cas d'utilisation spécifique auquel il pense.Une procédure stockée s'exécutera probablement plus rapidement pour un ensemble complexe de SQL, qui peut être arbitrairement réglé.Cependant, quelque chose que vous obtenez de choses comme la mise en veille prolongée est la mise en cache.Cela peut s'avérer beaucoup plus rapide pendant la durée de vie de votre application actuelle.

La couche d'abstraction supplémentaire le rendra plus lent qu'un pur appel à une procédure.Simplement du fait que vous disposez d'allocations supplémentaires sur le tas géré, ainsi que de poussées et d'extractions supplémentaires de la pile d'appels, la vérité est qu'il est plus efficace d'appeler une procédure plutôt que de demander à un ORM de créer la requête, quelle que soit la qualité de la requête. ORM l’est.

La lenteur, si elle est même mesurable, est discutable.Ceci est également facilité par le fait que la plupart des ORM disposent d'un mécanisme de mise en cache pour éviter d'effectuer la requête.

Même si la procédure stockée est 10 % plus rapide (ce n'est probablement pas le cas), vous voudrez peut-être vous demander à quel point elle est vraiment importante.Ce qui compte vraiment en fin de compte, c'est la facilité avec laquelle il est possible d'écrire et de maintenir du code pour votre système.Si vous codez une application Web et que vos pages reviennent toutes en 0,25 seconde, le temps supplémentaire économisé grâce à l'utilisation de procédures stockées est négligeable.Cependant, l'utilisation d'un ORM comme NHibernate peut présenter de nombreux avantages supplémentaires, qui seraient extrêmement difficiles à dupliquer en utilisant uniquement des procédures stockées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top