Bien que je respecte l'auteur de la communication, je suis humblement en désaccord avec la réponse fournie et non pour des "raisons religieuses". En d'autres termes, je crois que Microsoft n'a fourni aucune installation qui diminue le besoin de conseils pour utiliser les procédures stockées.
Toute directive fournie à un développeur qui favorise l'utilisation de requêtes SQL en texte brut doit être remplie de nombreuses mises en garde, de sorte que je pense que le conseil le plus prudent est d'encourager considérablement l'utilisation des procédures stockées et de décourager vos équipes de développeurs de s'engager dans la pratique. d'incorporer des instructions SQL dans le code, ou de soumettre des requêtes SQL brutes, en texte brut, en dehors des SPROC SQL (procédures stockées).
Je pense que la réponse simple à la question de savoir pourquoi utiliser un SPROC est celle du soumissionnaire: les SPROC sont analysés, optimisés et compilés. En tant que tels, leurs plans de requête / d'exécution sont mis en cache car vous avez enregistré une représentation statique d'une requête et vous ne la modifierez normalement que par des paramètres, ce qui n'est pas vrai dans le cas d'instructions SQL copiées / collées qui se transforment probablement de page en page et de composant / niveau, et sont souvent variablisés dans la mesure où différentes tables, même des noms de base de données, peuvent être spécifiés d'appel à appel. Permettre ce type de dynamique ad hocLa soumission SQL réduit considérablement la probabilité que le moteur DB réutilise le plan de requête pour vos instructions ad hoc, selon certaines règles très strictes. Ici, je fais la distinction entre les requêtes dynamiques ad hoc (dans l'esprit de la question posée) par rapport à l'utilisation du système SPROC sp_executesql efficace.
Plus précisément, il existe les composants suivants:
- Plans de requête série et parallèle qui ne contiennent pas de contexte utilisateur et permettent leur réutilisation par le moteur de base de données.
- Contexte d'exécution qui permet la réutilisation d'un plan de requête par un nouvel utilisateur avec différents paramètres de données.
- Cache de procédure qui est ce que le moteur de base de données interroge afin de créer les efficacités que nous recherchons.
Lorsqu'une instruction SQL est émise à partir d'une page Web, appelée «instruction ad hoc», le moteur recherche un plan d'exécution existant pour gérer la demande. Comme il s'agit d'un texte soumis par un utilisateur, il sera ingéré, analysé, compilé et exécuté, s'il est valide. À ce moment, il recevra un coût de requête de zéro. Le coût de la requête est utilisé lorsque le moteur de base de données utilise son algorithme afin de déterminer les plans d'exécution à expulser du cache.
Les requêtes ad hoc reçoivent une valeur de coût de requête d'origine de zéro, par défaut. Lors de l'exécution ultérieure du même texte de requête ad hoc exact, par un autre processus utilisateur (ou le même), le coût de la requête actuelle est réinitialisé au coût de compilation d'origine. Étant donné que notre coût de compilation de requêtes ad hoc est nul, cela n'augure rien de bon pour la possibilité de réutilisation. Évidemment, zéro est l'entier le moins valorisé, mais pourquoi serait-il expulsé?
Lorsque des pressions de mémoire surviennent, et ce sera le cas si vous avez un site souvent utilisé, le moteur de base de données utilise un algorithme de nettoyage pour déterminer comment il peut récupérer la mémoire utilisée par le cache de procédures. Il utilise le coût de requête actuel pour décider des plans à expulser. Comme vous pouvez le deviner, les plans avec un coût de zéro sont les premiers à être expulsés du cache car zéro signifie essentiellement «aucun utilisateur actuel ou référence à ce plan».
- Remarque: Plans d'exécution ad hoc - Le coût actuel est augmenté par chaque processus utilisateur, par le coût de compilation d'origine du plan. Cependant, aucun coût maximal d'un plan ne peut être supérieur à son coût de compilation d'origine ... dans le cas de requêtes ad hoc ... zéro. Ainsi, il sera "augmenté" de cette valeur ... zéro - ce qui signifie essentiellement qu'il restera le plan le moins coûteux.
Par conséquent, il est tout à fait probable qu'un tel plan sera expulsé en premier lorsque des pressions de mémoire surviendront.
Par conséquent, si vous disposez d'un serveur avec beaucoup de mémoire "au-delà de vos besoins", vous ne rencontrerez peut-être pas ce problème aussi souvent qu'un serveur occupé qui ne dispose que de mémoire "suffisante" pour gérer sa charge de travail. (Désolé, la capacité et l'utilisation de la mémoire du serveur sont quelque peu subjectives / relatives, bien que l'algorithme ne le soit pas.)
Maintenant, si je me trompe sur un ou plusieurs points, je suis certainement prêt à être corrigé.
Enfin, l'auteur a écrit:
"Nous avons maintenant une optimisation au niveau de l'instruction, de sorte qu'une requête correctement paramétrée provenant d'une application peut tirer parti du même plan d'exécution que cette requête incorporée dans une procédure stockée."
Je pense que l'auteur fait référence à l'option "Optimiser pour les charges de travail ad hoc".
Si tel est le cas, cette option permet un processus en deux étapes qui évite d'envoyer immédiatement le plan de requête complet au cache de procédure. Il n'envoie qu'un stub de requête plus petit. Si un appel de requête exact est renvoyé vers le serveur alors que le talon de requête est toujours dans le cache de procédure, le plan d'exécution de requête complet est enregistré dans le cache de procédure, à ce moment. Cela économise de la mémoire qui, lors d'incidents de pression de la mémoire, peut permettre à l'algorithme d'éviction d'expulser votre talon moins fréquemment qu'un plan de requête plus grand qui a été mis en cache. Encore une fois, cela dépend de la mémoire et de l'utilisation de votre serveur.
Cependant, vous devez activer cette option, car elle est désactivée par défaut.
Enfin, je tiens à souligner que, souvent, la raison même pour laquelle les développeurs intègrent SQL dans des pages, des composants et d'autres emplacements, c'est parce qu'ils souhaitent être flexibles et soumettre une requête SQL dynamique au moteur de base de données. Par conséquent, dans un cas d'utilisation réel, la soumission du même texte, appel sur appel, est peu susceptible de se produire, tout comme la mise en cache / l'efficacité que nous recherchons, lors de la soumission de requêtes ad hoc à SQL Server.
Pour plus d'informations, veuillez consulter:
https://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx
http://sqlmag.com/database-performance-tuning/don-t-fear-dynamic-sql
Bien,
Henry