Comprendre le mystère du temps d’attente des requêtes
C’est un scénario frustrant auquel de nombreux développeurs sont confrontés : une requête s’exécute parfaitement dans SQL Server Management Studio (SSMS) mais expire dans votre application web. Ce comportement déroutant soulève la question : Pourquoi cela se produit-il ?
Dans cet article de blog, nous allons démêler la complexité des problèmes de temps d’attente lors des appels de procédures stockées depuis une application web, en particulier celles construites avec ASP.NET 2.0 et SQL Server 2005. Vous apprendrez pourquoi la même requête peut donner des résultats significativement différents dans des environnements différents et quelles mesures vous pouvez prendre pour résoudre ce problème efficacement.
Le problème en question
Lorsque vous rencontrez un temps d’attente lors de l’exécution d’une requête via votre application web mais que vous constatez qu’elle fonctionne sans problème dans SSMS, cela peut résulter de plusieurs différences sous-jacentes. Voici un bref retour sur le scénario :
- Vous exécutez une procédure stockée depuis une application web, et elle expire.
- Vous vérifiez la même procédure dans SSMS, et elle s’exécute en moins d’une seconde.
Cette incohérence pousse les développeurs à chercher des réponses, car ils veulent s’assurer que leurs applications fonctionnent efficacement et sans interruption.
Analyse des paramètres de connexion
Découverte des différences
L’une des principales raisons pour lesquelles ce problème de temps d’attente se produit est liée aux différents paramètres de connexion que les applications .NET utilisent par rapport à ceux de SSMS. En analysant les paramètres de connexion via SQL Profiler, vous pourriez remarquer des paramètres spécifiques qui sont configurés différemment, par exemple :
-- protocole réseau : 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
Paramètre clé : ARITHABORT
Parmi ces paramètres, l’option arithabort
joue un rôle crucial dans les performances des requêtes. Ce paramètre affecte la manière dont SQL Server traite certaines opérations et est particulièrement lié à la capacité de l’optimiseur de requête à choisir un plan d’exécution efficace. Dans de nombreux cas, changer arithabort
de off
à on
peut améliorer radicalement les performances, comme observé dans des scénarios pratiques où le temps d’exécution d’une requête est passé de 90 secondes à seulement 1 seconde.
Sniffing de paramètres
Le problème de temps d’attente est également lié à un concept appelé sniffing de paramètres. C’est lorsque SQL Server choisit un plan de requête basé sur les paramètres initiaux passés lors du premier appel. Si le contexte d’exécution réel change en raison de paramètres ou de paramètres de connexion différents, le plan précédemment choisi peut ne pas être optimal pour les exécutions suivantes, entraînant des ralentissements et des temps d’attente.
Mise en œuvre des solutions
Alignement des paramètres de connexion
Pour lutter contre le problème de temps d’attente, vous pouvez mettre en œuvre les stratégies suivantes :
-
Aligner les paramètres de connexion : Avant d’exécuter des requêtes, vous pouvez vous assurer que les paramètres de connexion utilisés dans l’application web correspondent à ceux de SSMS. Cela peut impliquer de spécifier manuellement des paramètres tels que
set arithabort on
dans votre procédure stockée ou votre code d’application. -
Tester chaque paramètre : Vous pouvez isoler chaque paramètre de connexion et tester son impact. Apportez des modifications, reconnectez-vous et observez les différences de vitesse d’exécution ou les occurrences de temps d’attente.
Utiliser WITH RECOMPILE
Comme solution temporaire, surtout pour les rapports où le temps d’exécution n’est pas critique, vous pouvez exécuter la procédure stockée avec l’option WITH RECOMPILE
. Cela oblige SQL Server à créer un nouveau plan d’exécution chaque fois que la procédure stockée est exécutée, en tenant compte des changements de paramètres. Cependant, soyez prudent avec cette approche pour les requêtes exécutées fréquemment, car la recompilation peut introduire des surcharges et des retards supplémentaires.
Conclusion
Les problèmes de temps d’attente lors de l’exécution de requêtes depuis des applications web peuvent souvent être attribués à des divergences dans les paramètres de connexion, en particulier avec des propriétés telles que arithabort
. En comprenant l’impact de ces paramètres et les effets du sniffing de paramètres, les développeurs peuvent mettre en œuvre des solutions pour atténuer efficacement les problèmes de performance.
Avec une attention particulière à ces nuances, vous pouvez vous assurer que vos applications web fonctionnent de manière optimale et offrent aux utilisateurs une expérience fluide.
Dernières réflexions
Si vous rencontrez des problèmes de temps d’attente similaires ou si vous avez des perspectives issues de vos propres expériences, nous vous encourageons à partager dans les commentaires ci-dessous !