Exécuter plusieurs commandes SQL dans un voyage aller-retour
Je suis la construction d'une application et je veux par lots de plusieurs requêtes dans un seul voyage aller-retour à la base de données. Par exemple, disons une page unique a besoin d'afficher une liste d'utilisateurs, une liste de groupes et une liste d'autorisations.
J'ai donc stocké procs (ou de simples commandes sql comme "select * from Users"), et je veux exécuter trois d'entre eux. Toutefois, pour remplir une page que je dois faire 3 allers-retours.
Maintenant, je pourrais écrire une procédure stockée ("getUsersTeamsAndPermissions") ou d'exécuter une seule commande SQL "select * from Users;exec getTeams;select * from Autorisations".
Mais je me demandais si il y avait une meilleure façon de spécifier de faire 3 opérations en un seul voyage aller-retour. Les prestations comprennent le plus facile de l'unité d'essai, et en permettant au moteur de base de données parrallelize les requêtes.
Je suis à l'aide de C# 3.5 et SQL Server 2008.
- Si c'est ASP.Net et le serveur de base de données est juste à côté de du Serveur Web(ou c'est une seule application), alors c'est probablement une optimisation prématurée..
- une optimisation prématurée ou d'un correctif pour un autre problème de conception.
- Chaque fois que je viens lire cette question, je me suis amusée à combien de personnes lisent mon exemple simple que j'ai faite à cette question et à supposer qu'ils connaissent les caractéristiques de performance de mon application mieux que moi.
- Merci de lire ma réponse ici: stackoverflow.com/a/49687720/538387
Vous devez vous connecter pour publier un commentaire.
Le seul multi-partie commande et la procédure stockée options que vous mentionnez sont les deux options. Vous ne pouvez pas le faire de telle manière à ce qu'ils sont "parallèles" sur la db. Toutefois, ces deux options ne se traduisent par une seul voyage aller-retour, de sorte que vous êtes bien là-bas. Il n'y a pas moyen de les envoyer de manière plus efficace. Dans sql server à partir de 2005, un multi-partie de commande qui est entièrement paramétrable est très efficace.
Modifier: ajout d'informations sur les raisons d'intégrer dans un seul appel.
Bien que vous ne voulez pas trop s'occuper de réduire les appels, il y peut avoir des raisons légitimes de cette.
Quelque chose comme cette. L'exemple est probablement pas très bonne car elle ne permet pas d'éliminer correctement les objets, mais vous obtenez l'idée. Voici un nettoyés version:
Faire un aller-retour vs trois aura plus de eficient en effet. La question est de savoir si cela en vaut la peine. L'ensemble de la ADO.Net et C# 3.5, l'ensemble d'outils et le cadre s'oppose à ce que vous essayez de faire. TableAdapters, Linq2SQL, EF, tous ces aiment traiter avec un simple appel==un jeu de résultats de la sémantique. Donc, vous risquez de perdre certains de sérieux de la productivité en essayant de battre le Cadre dans la soumission.
Je dirais qu'à moins d'avoir un sérieux mesures montrant que vous avez besoin pour réduire le nombre d'allers-retours, s'abstenir. Si vous ne fin besoin, alors l'utilisation d'une procédure stockée pour au moins donner une API de type sémantique.
Mais si votre requête est vraiment ce que vous avez posté (ie. sélectionnez tous utilisateurs, tous équipes et tous autorisations), alors vous obviosuly ont beaucoup plus de poisson à frire avant de réduire les allers-retours... réduire les jeux de résultats en premier.
J'cette cette lien pourrait être utile.
Envisager d'utiliser au moins la même connexion-ouverture; selon ce qu'il dit ici, ouverture d'une connexion presque le haut-leader de la performance des coûts au sein de l'Entité-Cadre.
Tout d'abord, 3 allers-retours n'est pas vraiment un gros problème. Si vous parliez de 300 allers-retours puis ce serait une autre question, mais pour seulement 3 allers-retours je conderer ce definitley être un cas de naissance prématurée d'optimisation.
Cela dit, je ferais ce serait probablement exécuté le 3 stockées procuedres à l'aide de SQL:
Vous pouvez alors parcourir les résultats retournés définit comme vous le feriez si vous avez exécuté directement plusieurs ensembles de lignes.
Construire une température de-table? Insérez tous les résultats dans la table temporaire et puis
select * from @temp-table
comme dans
etc... Seulement un séjour à la base de données, bien que je ne suis pas sûr, il est effectivement plus efficace.