Question

Je suis en train de déboguer la source d'un délai d'attente SQL dans une application web que je maintiens. J'ai le code source du code C # derrière, donc je sais exactement ce que le code est en cours d'exécution. Je déboguée l'application jusqu'à la ligne qui exécute le code SQL fois, et je regarder la requête en cours d'exécution dans profileur SQL.

Lorsque cette requête exécute à partir du Web, il arrive à expiration au bout de 30 secondes. Cependant, quand je couper / coller exactement à la requête présentée dans Profiler, et je l'ai mis dans SSMS et l'exécuter, il retourne presque instantanément. J'ai tracé le problème ARITHABORT étant réglé sur OFF dans la connexion que le Web utilise (c'est, si je tourne ARITHABORT OFF à la session SSMS, il court depuis longtemps, et si je le remettre sous tension puis il court très rapidement). Cependant, la lecture de la description de ARITHABORT, il ne semble pas appliquer ... Je fais un simple SELECT, et il n'y a pas de calcul en cours d'exécution du tout .. un seul INNER JOIN avec une condition WHERE:

Pourquoi serait ARITHABORT OFF provoquer ce comportement dans ce contexte ?? Est-il possible que je peux modifier le réglage ARITHABORT pour cette connexion de SSMS? J'utilise SQL Server 2008.

Était-ce utile?

La solution

votre code C # envoie une requête ad hoc SQL à SQL Server, en utilisant quelle méthode? Avez-vous envisagé d'utiliser une procédure stockée? Ce serait sans doute d'assurer les mêmes performances (au moins dans le moteur), peu importe qui l'a appelé.

Pourquoi? Le réglage ARITHABORT est l'une des choses que l'optimiseur regarde quand il est de déterminer comment exécuter votre requête (plus spécifiquement, pour la correspondance du plan). Il est possible que le plan dans le cache a le même réglage que SSMS, de sorte qu'il utilise le plan mis en cache, mais au contraire mettre votre code C # est contraint une recompilation (ou peut-être vous frappez vraiment BAD le plan dans le cache), ce qui peut certainement nuire à la performance dans beaucoup de cas.

Si vous appelez déjà une procédure stockée (vous ne publiez pas votre requête, mais je pense que vous vouliez), vous pouvez essayer d'ajouter OPTION (RECOMPILE) à la requête incriminée (ou requêtes) dans la procédure stockée. Cela signifie ces déclarations recompile toujours, mais il pourrait empêcher l'utilisation du mauvais plan que vous semblez frapper. Une autre option est de faire en sorte que lorsque la procédure stockée est compilée, le lot est exécuté avec SET ARITHABORT ON.

Enfin, vous semblez demander comment vous pouvez modifier le réglage ARITHABORT dans SSMS. Je pense que vous vouliez dire demander comment vous pouvez forcer le réglage ARITHABORT dans votre code. Si vous décidez de continuer à envoyer ad hoc SQL à partir de votre application C #, puis bien sûr vous pouvez envoyer une commande sous forme de texte comportant plusieurs déclarations séparées par des points-virgules, par exemple:.

SET ARITHABORT ON; SELECT ...

Pour plus d'informations sur la raison pour laquelle ce problème se produit, voir grand article de Erland Sommarskog:

Autres conseils

Cette réponse comprend un moyen de résoudre ce problème:

  

En exécutant les commandes suivantes en tant qu'administrateur sur la base de données toutes les requêtes exécutées comme prévu quel que soit le réglage ARITHABORT.

 DBCC DROPCLEANBUFFERS
 DBCC FREEPROCCACHE

Mise à jour

Il semble que la plupart des gens finissent par avoir ce problème sont très rares, et la technique ci-dessus est une solution unique décente. Mais si une requête spécifique présente de ce problème plus d'une fois, une solution à plus long terme à ce problème serait d'utiliser comme OPTIMIZE FOR Conseils de requête et OPTION(Recompile), comme décrit dans cet article .

J'ai eu ce problème plusieurs fois avant, mais si vous avez une procédure stockée avec le même problème et recréer la chute procédure stockée va résoudre le problème.

Il est appelé reniflement des paramètres. Vous devez localiser toujours les paramètres de la procédure stockée pour éviter ce problème à l'avenir.

Je comprends cela pourrait ne pas être ce que l'affiche originale veut, mais pourrait aider quelqu'un avec le même problème.

Si vous utilisez Entity Framework, vous devez savoir que les paramètres de requête pour les valeurs de chaîne sont envoyées à la base de données nvarchar par défaut, si la colonne de base de données pour comparer est tapé varchar, en fonction de votre collation, le plan d'exécution de la requête peut exiger une « conversion implicit » étape, qui force une analyse complète. Je pourrais le confirmer en regardant dans la surveillance de la base de données en option coûteuse requêtes, qui affiche le plan d'exécution.

Enfin, une explication sur ce comportement dans cet article: https://www.sqlskills.com/blogs / jonathan / implicites-conversions qui-cause index-scans /

J'ai eu le même problème et il a été fixé par voie d'exécution « WITH RECOMPILE ». Vous pouvez également essayer d'utiliser reniflement des paramètres. Mon problème était lié au cache SQL.

Si vous pouvez modifier votre code pour corriger le paramètre renifler optimiser pour indice inconnu est votre meilleure option. Si vous ne pouvez pas changer votre code est la meilleure option « nom de proc » exec sp_recompile qui forcera seulement un proc stocké pour obtenir un nouveau plan d'exécution. Et laissant tomber recréer un proc aurait un effet similaire, mais pourrait provoquer des erreurs si quelqu'un tente d'exécuter le proc pendant que vous l'avez abandonné. DBCC FREEPROCCACHE supprime tous vos plans mises en cache qui peut faire des ravages ok votre système et y compris causant beaucoup de temps morts dans un environnement de production de transactions lourdes. Réglage arithabort est pas une solution au problème, mais est un outil utile pour découvrir si sniffing paramètre est la question.

J'ai le même problème lorsque vous essayez d'appeler SP de SCSM il a fallu 2 sec, tandis que de la webapp (ASP.NET) il a fallu environ 3 min.

J'ai essayé toutes les solutions proposées sp_recompile, DBCC FREEPROCCACHE et DBCC DROPCLEANBUFFERS mais rien de fixe mon problème, mais lorsque le paramètre essayé reniflant a fait le tour, et marchait très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top