Optimisation: déplacer les déclarations de variables en haut de votre procédure

15

Tout en travaillant sur l'optimisation de certaines procédures stockées, je me suis assis avec le DBA et j'ai parcouru certaines procédures stockées avec une activité de blocage et / ou de lecture / écriture élevée.

Le DBA a mentionné une chose: je devrais déclarer toutes les variables (en particulier TABLEcelles) en haut de la procédure stockée pour éviter les recompilations.

C'est la première fois que j'en entends parler et je cherchais une confirmation avant de revoir toutes les différentes procédures stockées que nous avons. Il l'appelait "visualisation tardive du code", et la recompilation bloquait le schéma qui expliquerait le blocage.

Le déplacement de toutes les déclarations de variables en haut de votre procédure stockée réduit-il les recompilations?

brad.v
la source

Réponses:

18

Non.

Cela était vrai il y a longtemps (et ce n'est plus le cas, au moins depuis SQL Server 2000), ou cela n'a jamais été vrai et votre administrateur de base de données a simplement confondu sa recommandation avec la suivante :

Il est important de regrouper toutes les instructions DDL (comme la création d'index) pour les tables temporaires au début d'une procédure stockée. En regroupant ces instructions DDL, des compilations inutiles dues à un changement de schéma peuvent être évitées.

Vous pouvez trouver une autre explication du raisonnement derrière cette recommandation sur cette page .

Si nous examinons cette base de connaissances Microsoft , nous constatons que la cause d'une recompilation de procédure stockée peut être l'une des suivantes (SQL Server 2005+):

  1. Le schéma a changé.
  2. Les statistiques ont changé.
  3. Recompilez DNR.
  4. Définir l'option modifiée.
  5. La table temporaire a changé.
  6. L'ensemble de lignes distant a été modifié.
  7. Pour les perms de navigation modifiées.
  8. L'environnement de notification de requête a changé.
  9. La vue MPI a changé.
  10. Les options du curseur ont été modifiées.
  11. Avec option de recompilation.

La déclaration d'une variable - même une variable de table (c'est-à-dire @table_variable) - ne peut évidemment déclencher aucun de ces événements, car déclarer une variable ne compte pas comme DDL . Une variable (même une variable de table) est un objet temporaire utilisé exclusivement pour votre programmation T-SQL. C'est pourquoi les variables de table ne reçoivent aucune statistique et ne sont pas liées par des transactions . La déclaration d'une variable (table ou non) ne peut pas déclencher une recompilation proc.

La création d'une table temporaire (ie #temp_table) ou d'un index, cependant, est DDL qui affecte la définition physique de la base de données. Les tables temporaires et les index sont des objets "réels" avec des statistiques et un contrôle transactionnel. Par conséquent, leur création peut déclencher l'un des événements 1, 2 ou 5 de la liste ci-dessus et ainsi déclencher une recompilation de proc.

Nick Chammas
la source
3

Cela ne devrait pas faire la différence ni réduire les verrous de compilation ou provoquer moins de recompilations pour déclarer une variable à mi-chemin de la pile ou en haut. Il se trouve que je fais cela au sommet pour la lisibilité le plus souvent.

Pour en venir à la partie "quelle est ma pensée DBA" de la question, la seule chose que je puisse trouver (à part le point de Nick qui pense à la façon dont quelque chose était) est peut-être qu'ils parlaient de reniflement de paramètres (voir Option 2 à ce lien sur la conversation simple)

À propos de votre blocage -> Si vous voyez un véritable blocage, ce n'est pas le type de conflit de verrouillage de compilation dont votre DBA parle le plus probablement. Bien qu'il soit vrai qu'il y a certaines choses qui affectent cela (pas les tables qualifiant le schéma, pas le schéma qualifiant vos appels de procédure stockée, par exemple) ce n'est pas la cause de vos lectures élevées certainement et probablement pas la cause de votre blocage. Vous devez absolument faire tout votre possible pour éviter ces verrous de compilation. Mais je considérerais le réglage et l'optimisation du reste du code de procédure stockée comme une tâche plus importante que de se soucier de l'emplacement des variables. Vous pouvez également lire Comment identifier et résoudre les verrous de compilation si vous souhaitez vérifier que vous ne rencontrez pas de problèmes ici.

Publiez ces exemples avant / après et nous verrons où en est le DBA.

Mike Walsh
la source