Pourquoi exécuter des procédures stockées est plus rapide que la requête SQL d'un script?
En fait, si j'ai appeler des procédures stockées à partir de mon application, j'ai besoin d'une connexion à ma base de données.
Alors, pourquoi appeler un "procédures stockées" devrait être plus rapide que le passage d'une requête SQL" chaîne à être exécuté?
source d'informationauteur markzzz
Vous devez vous connecter pour publier un commentaire.
SQL Server fondamentalement passe par ces étapes pour exécuter tout requête (appel de procédure stockée ou ad-hoc instruction SQL):
1) vérifier systématiquement la requête
2) si c'est d'accord - il vérifie le cache de plan pour voir si elle a déjà un plan d'exécution de cette requête
3) si il y a un plan d'exécution - que le plan est (re-)utilisés et d'exécution de la requête
4) si il n'y a pas de plan pour le moment, un plan d'exécution est déterminé
5) que le plan est stockée dans le cache de plan pour une réutilisation ultérieure
6) la requête est exécutée
Le point est: ad-hoc SQL et les procédures stockées sont treatly pas différemment.
Si ad-hoc requête SQL est correctement à l'aide de paramètres, comme il se doit, de toute façon, pour éviter les attaques par injection SQL - ses caractéristiques de performance ne sont pas différents et très certainement pas pire que l'exécution d'une procédure stockée.
Procédure stockée ont d'autres avantages (pas besoin d'accorder aux utilisateurs directs d'accès à la table, par exemple), mais en termes de performance, en utilisant correctement paramétrées ad-hoc des requêtes SQL est tout aussi efficace que l'utilisation de procédures stockées.
Mise à jour: l'utilisation de procédures stockées sur non paramétrées requêtes est préférable pour deux raisons principales:
depuis chaque non-paramétrées requête est une de nouveau, de différent de requête de SQL Server, il doit passer par toutes les étapes de la détermination du plan d'exécution, pour chaque requête (et donc de perdre du temps et aussi de gaspiller de la mémoire cache du plan de l'espace, depuis le stockage de l'exécution du plan dans le plan de cache n'aide pas vraiment à la fin, depuis cette requête particulière sera probablement pas être exécutée de nouveau)
non paramétrées, les requêtes sont à risque d'attaque par injection SQL et devrait être évitée à tous les frais
Parce que chaque fois que vous passez une chaîne de requête de SQL Server, le code doit être compilé etc, procédures stockées sont déjà compilées et prêt à exécuter sur le serveur.
Vous êtes également à l'envoi de moins de données sur le réseau bien que ce n'est généralement qu'un impact minime de toute façon.
EDIT:
Comme une note de côté procédures stockées ont d'autres avantages.
1) la Sécurité - Puisque la requête est stockée sur le serveur, vous n'êtes pas le transmettre sur le réseau, ce qui signifie que chacun d'intercepter le trafic de votre réseau ne prend pas en obtenir un aperçu de votre structure de la table. Aussi bien conçu SP permettra d'éviter les attaques par injection.
2) Code de la séparation, vous gardez votre code de base de données dans votre base de données et le code de votre application dans votre application, il y a très peu de croisement et je trouve que cela rend la correction de bug beaucoup plus agréable.
3) de la Maintenabilité et de la Réutilisation de Code, vous pouvez réutiliser une procédure plusieurs fois sans avoir à copier coller la requête, aussi si vous souhaitez mettre à jour la requête, vous avez juste à le mettre à jour en un seul endroit.
4) la Diminution du trafic réseau. Comme mentionné ci-dessus, ceci peut ne pas être un problème pour la plupart des gens, mais avec une grande application, vous pouvez réduire considérablement la quantité de données transférées via votre réseau par commutation à l'aide de procédures stockées.
Votre relevé que les Procédures Stockées sont plus rapides que les Requêtes SQL n'est que partiellement vrai. Pour expliquer: la Plupart de ces réponses déjà expliquer qu'avec des procédures stockées un plan de requête est générée et mise en cache. Donc, si vous appelez la procédure stockée à nouveau, le SQL moteur de recherche d'abord dans sa liste de plans de requête et s'il trouve une correspondance, il utilise l'optimisation du plan.
Passage normal de la requête ne permet pas de cet avantage que le moteur SQL ne sait pas à quoi s'attendre et donc il ne peut pas trouver une correspondance à votre requête. Il crée un plan à partir de zéro, puis de rendu de vos résultats.
Bonne nouvelle: Vous pouvez activer le plan de la mise en cache de vos requêtes en utilisant Parametized requêtes, une nouvelle fonctionnalité de SQL. Cela vous permet de générer des plans pour vos requêtes et peut être très efficace dans votre situation que la plupart des requêtes vous passer de code, reste le même, sauf pour les variables dans la clause where la plupart du temps. Il est aussi un lieu où vous pouvez forcer le paramétrage pour toutes vos requêtes. Recherche MSDN pour ce sujet, devrait vous aider à décider ce qui est mieux.
Cela dit, Procédures Stockées reste un bon moyen pour interagir avec la DB, à partir de vos applications, car il fournit une couche de sécurité supplémentaire.
Espère que cela a été utile!
Une autre question, qui est plus regardé, comparer le trafic réseau entre le serveur web et le serveur de base de données de ce-
exec someproc @var1='bla', @var2='bla', @var3='bla'
-
Select champ1, champ2, champ3, field4, field5, field6....field30
rejoignez table1 sur la table2.field12 = table1.field12
où blah blah blah
et table1.field3 = @var1 et table2.field44 = @var2 et (table1.champ1 est null ou table1.champ1 = @var3.......
Voir la différence? Pour 99% d'entre nous ce ne sera probablement pas d'importance, mais pour certains d'entre vous écrit les applications hautes performances cela pourrait, même si il y a probablement un peu de mise en cache, ou d'autres moyens de régler ce problème.
Je pense que beaucoup de gens qui prétendent qu'il n'y a pas de différence entre les requêtes spécifiques et les procédures stockées sont généralement en utilisant des tables de magasins d'objets quelque soit la PLATEFORME qu'ils utilisent, et c'est très bien. Il y a encore beaucoup de lourds piloté par les données les applications de l'entreprise, à juste titre ou à tort, qui ont 1000+ ligne des procédures stockées. Vous pouvez vous retrouver à travailler sur eux. Aussi, pour ceux d'entre vous qui ont à faire des changements dans la production à chaque fois dans un certain temps et ont besoin de contourner le processus formel il est beaucoup plus facile à faire que dans la base de données que dans la production de code compilé. Modifier proc...fait. Cow-boy, horrible, le mal arrive. Oui, je sais le faire, c'est un péché impardonnable dans un grand nombre de vos esprits, signe de cisaillement de mou...mais ça arrive. Juste quelque chose à penser trop.
Je sais que les derniers outils généralement stockées procs une douleur à l'arrière si vous vous attendez à toutes vos entités générées bien pour vous, mais stockées procs ont encore leur place parfois.
procédures stockées sont compilés et mis en cache. Mais les instructions SQL sera, par rapport à des plans d'exécution et si une correspondance est actuellement utilisée, invalidant ainsi un peu de tout avantage.
Quelle est la réelle différence de performance après un certain nombre d'exécutions ?
Contrairement à la norme SQL, procédures stockées sont compilé et optimisé par le serveur de base de données. Cette optimisation consiste à utiliser des informations sur la structure d'une base de données qui est nécessaire au moment de l'exécution par la procédure stockée. Ce processus de stocker les informations d'exécution (plan d'exécution) est un gain de temps considérable, surtout si la procédure stockée est appelée à de nombreuses reprises.
Vitesse est également améliorée par le fait que les procédures stockées entièrement exécutées sur le serveur de base de données - il n'y a pas besoin de passer de gros morceaux de code SQL sur un réseau. Pour une simple instruction SELECT, qui ne pourrait pas faire une grande différence, mais dans les cas où nous effectuons une série de boucles et de calculs, il peut avoir un effet significatif.