J'ai une procédure stockée qui s'arrête à chaque fois qu'elle est appelée depuis l'application web.
J'ai lancé le Sql Profiler et tracé les appels qui sont interrompus et j'ai finalement trouvé ces choses :
- J'ai exécuté les instructions depuis MS SQL Management Studio, avec les mêmes arguments (en fait, j'ai copié l'appel de procédure depuis sql profile trace et je l'ai exécuté) : Il se termine en 5~6 secondes en moyenne.
- Mais lorsqu'il est appelé à partir d'une application Web, il prend plus de 30 secondes (dans la trace), de sorte que ma page Web se termine à ce moment-là.
Mis à part le fait que mon application web a son propre utilisateur, tout est identique (même base de données, connexion, serveur, etc.). J'ai également essayé d'exécuter la requête directement dans le studio avec l'utilisateur de l'application web et cela ne prend pas plus de 6 secondes.
Comment puis-je savoir ce qui se passe ?
Je suppose que cela n'a rien à voir avec le fait que nous utilisons des couches BLL > DAL ou des adaptateurs de table, car la trace montre clairement que le retard se situe dans la procédure réelle. C'est tout ce que je peux imaginer.
EDITAR J'ai découvert dans ce lien qu'ADO.NET met ARITHABORT
à true - ce qui est bon la plupart du temps mais parfois cela arrive, et la solution suggérée est d'ajouter with recompile
à la procédure stockée. Dans mon cas, cela ne fonctionne pas mais je soupçonne que c'est quelque chose de très similaire à ceci. Quelqu'un sait-il ce que ADO.NET fait d'autre ou où je peux trouver la spécification ?
1 votes
Cela pourrait être lié à la quantité de données renvoyées ?
0 votes
@Barry : Non, lorsque je lance la même procédure (copiée à partir de la trace également - ce qui signifie les mêmes paramètres) dans Management Studio, elle s'exécute en 6 secondes.
0 votes
@Jayantha : Le point n'est PAS que le sp est lent, mais que QUELQUE CHOSE entre ado.net et sql l'est. Je ne vois pas comment le sp pourrait faire une différence.
2 votes
Le SP renvoie-t-il beaucoup de données, par exemple des colonnes image/texte/varchar(max) ? La quantité de données à consommer sur le client serait énorme, ce qui prendrait beaucoup de temps. SSMS coupe ces jeux de résultats de manière plus efficace.
1 votes
Duplicata possible de stackoverflow.com/questions/2248112/
0 votes
@Aaron, j'ai essayé de modifier les paramètres suivants
ARITHABORT
options ETWITH RECOMPILE
mais ils n'ont pas eu d'effets, comme je l'ai mentionné dans ma question.0 votes
Cela répond-il à votre question ? La requête s'interrompt lorsqu'elle est exécutée à partir du Web, mais elle est très rapide lorsqu'elle est exécutée à partir de SSMS.