CORRECTIF : L'exécution simultanée de procédure stockée qui RECOMPILE peut échouer exécuter toutes les instructions

IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d’articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d’avoir accès, dans votre propre langue, à l’ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s’exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s’efforce aussi continuellement de faire évoluer son système de traduction automatique.

250506
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
BOGUE : 55251 (SQLBUG_70)
Symptômes
Une procédure stockée peut échouer en silence exécuter toutes les instructions qu'il contient si les conditions suivantes sont remplies :

  • Plusieurs connexions sont exécutent simultanément la même procédure.

  • Une référence est faite à une table temporaire créée à l'extérieur de cette procédure.

  • Une ou plusieurs instructions peuvent également provoquer la recompilation (potentiellement déclenchée par «auto update statistics») faites suivre la référence à cette table temporaire.
Toutes les instructions peuvent exécuter pour certains utilisateurs exécutant la procédure, tandis que d'autres ne.
Contournement
Créer la procédure avec la clause WITH RECOMPILE ou utilisez la clause WITH RECOMPILE l'exécution de la procédure.
Statut
Microsoft a confirmé l'existence de ce problème dans SQL Server 7.0. Ce problème a été corrigé dans le Service Pack 2 US pour Microsoft SQL Server 7.0. Pour plus d'informations, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
254561INF: Comment faire pour obtenir le Service Pack 2 pour Microsoft SQL Server 7.0 et Microsoft Data Engine (MSDE) 1.0
Pour plus d'informations, contactez votre support technique.
Plus d'informations
Si une référence est faite à une table temporaire créée à l'extérieur de la procédure en cours, qu'instruction et toutes les instructions suivantes ne peuvent pas être compilées lorsque la procédure est exécutée en premier. Cela est dû au fait qu'aucune information n'est connue sur le schéma de la table. Une fois l'exécution atteint cette instruction et les valeurs de schéma et de la cardinalité sont disponibles, la procédure est recompilée à l'aide de ces informations. Pour minimiser les temps de compilation, SQL Server effectue une «compilation partielle» dans ce cas et génère uniquement un plan de requête pour les instructions à celle-ci.

Puisque plusieurs utilisateurs peuvent partager un plan compilé, SQL Server 7.0 sérialise recompilations pour faire en sorte que seule une des connexions fonctionne la recompilation. Si vous devez également recompiler les autres connexions, ils attendent sur la première connexion pour terminer sa recompilation et de reprendre l'exécution à leur prochaine étape.

Si vous rencontrez une situation où deux connexions se trouvent à différents stades de l'exécution et celui qui déclenche la recompilation est tout d'abord avant la référence à la table temporaire créée à l'extérieur de la procédure, il arrêtera la compilation d'un plan lorsqu'il atteint cette instruction. Si une seconde connexion se situe après cela et déclenche également une recompilation lors de la compilation de la première connexion, il reprend l'exécution et incorrectement pense qu'il a exécuté toutes les instructions dans le plan.

Si vous utilisez WITH RECOMPILE, lors de création de la procédure ou lorsqu'il est exécuté, les deux connexions jamais partagent le même plan compilé et ne rencontre jamais de cette condition.

Dans la mesure du possible, il est également conseillé de référencer une table temporaire créée à l'extérieur de la procédure en cours, car elle requiert toujours une recompilation de la procédure. Vous trouverez les autres méthodes de programmation pour les procédures stockées sous la rubrique «Conseils pour Transact-SQL» dans la documentation en ligne de SQL.

Pour déterminer qu'une procédure est en cours recompilée, vous pouvez les visualiser avec l'événement SP: Recompile dans le Générateur de profils SQL.
compiler la procédure stockée partielle incomplète

Avertissement : Cet article a été traduit de manière automatique

Propriétés

ID d'article : 250506 - Dernière mise à jour : 02/01/2014 13:28:40 - Révision : 2.0

  • Microsoft SQL Server 7.0 Standard
  • kbnosurvey kbarchive kbmt kbbug kbfix KB250506 KbMtfr
Commentaires