C'est ce que je l'ai appris si loin de mes recherches.
.NET envoie dans les paramètres de connexion qui ne sont pas les mêmes que ce que vous obtenez lorsque vous vous connectez au studio de gestion. Voici ce que vous voyez si vous renifler la connexion avec Sql Profiler:
-- network protocol: TCP/IP
set quoted_identifier off
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls off
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed
Je suis coller maintenant les mettre en dessus toutes les requêtes que je lance lorsque vous êtes connecté au serveur SQL, pour vous assurer que les paramètres sont les mêmes. Dans ce cas, j'ai essayé chaque paramètre individuellement, après la déconnexion et la reconnexion, et j'ai constaté que le changement de l'état d'arrêt à activé réduisait le problème de 90 secondes à 1 seconde.
L'explication la plus probable est liée au reniflage de paramètres, une technique que Sql Server utilise pour choisir ce qu'il pense être le plan de requête le plus efficace. Lorsque vous modifiez l'un des paramètres de connexion, l'optimiseur de requête peut choisir un plan différent, et dans ce cas, il a apparemment choisi un mauvais.
Mais je ne suis pas totalement convaincu de cela. J'ai essayé de comparer les plans de requête réels après avoir changé ce paramètre et je n'ai pas encore vu le diff montrer les changements.
Y a-t-il quelque chose d'autre à propos du paramètre arithabort qui pourrait entraîner une exécution lente de la requête dans certains cas? La solution semblait simple: il suffit de mettre set arithabort en haut de la procédure stockée. Mais cela pourrait conduire au problème inverse: changer les paramètres de la requête et tout d'un coup il fonctionne plus vite avec 'off' que 'on'.
Pour le moment, j'utilise la procédure 'with recompile' pour m'assurer que le plan est régénéré à chaque fois. C'est correct pour ce rapport particulier, car il faut peut-être une seconde à recompiler, et ce n'est pas trop visible sur un rapport qui prend 1-10 secondes pour revenir (c'est un monstre).
Mais ce n'est pas une option pour d'autres requêtes qui s'exécutent beaucoup plus fréquemment et doivent retourner aussi rapidement que possible, en quelques millisecondes seulement.
J'ai eu le même problème et http://stackoverflow.com/questions/250713/sqldataadapter-fill-method-slow résolu mon problème – David