11
votes

La modification d'une procédure stockée expirait-elle des plans d'exécution en cache?

est exécutant une instruction alter pour une procédure stockée car tous les plans d'exécution mis en cache pour cette procédure stockée deviennent invalides et expirent dans SQL Server 2008/2005?


0 commentaires

3 Réponses :


9
votes

oui.

Vous pouvez vérifier cela en faisant xxx

avant et après.

"http: // http: // technique.microsoft.com/en-us/library/cc293624.aspx "rel =" noreferrer "> TechNet

[Situations dans lesquelles des plans serait supprimé du cache inclure] Les opérations globales telles que l'exécution DBCC FreeProctacaCaCaCaCaCaCaCaCrocaC (code> pour effacer tous les plans du cache, ainsi que des modifications à une seule procédure, telle que alter Procédure , qui supprimerait tous les plans de cette procédure de cache.


11 commentaires

Alors que je vous croyais (comme vous avez une bonne réputation), il est documenté sur MSDN n'importe où


Oui ce sera. Trouvera un lien.


@Aaron - ne mentionne pas explicitement alter proc que je peux voir.


Je pense que la table ou affichage est destinée à signifier tout changement de schéma. Vous pouvez vérifier avec les événements de trace que le schéma a changé la sous-classe est ce qui se produit.


Eh bien, au moins, vous verrez SP: CacherMove Events (pas nécessairement un recompilement explicite).


@Aaron - Yep. J'espérais juste trouver une citation absolument non ambiguë mais pas de chance jusqu'à présent Même dans ce livre blanc


@Kane - l'a trouvé absolument sans ambiguïté ici! . .. Ces situations comprenaient des opérations globales telles que l'exécution de FreeProctaccacaccacacacédent à tous les plans du cache, ainsi que des modifications à une seule procédure, telles que la procédure d'altérilitation, qui supprimerait tous les plans de cette procédure de cache. ...


FYI J'ai déposé un bug contre la documentation. connect.microsoft.com/sqlserver/feedback/Détails/687418 .. . N'hésitez pas à voter / commentaires.


L'élément Connect a été mis à jour avec un engagement de corriger la documentation.


@Aaronbertrand, mais qu'en est-il des procédures stockées qui utilisent SQL dynamique où des mandrins de code SQL sont ajoutés à (ou supprimés de) l'instruction SQL résultante? En fonction des paramètres d'entrée, la même SCROC peut générer différentes déclarations ad-hoc SQL. Cela peut être le cas des Sprates utilisées pour la recherche et la filtration des données à afficher dans les grilles d'interface utilisateur. Lorsque cette SPROC est abandonnée et créée à nouveau (par exemple avec code mis à jour), ces plans précédemment mis en cache pour chaque cas d'appel à la CPR-SPROP ont également été retirés du cache? Je ne le pense pas.


@Andrews qui est facile à tester, non? N'oubliez pas que quelque chose une procédure appelle via sys.sp_executeql ne "appartient pas" à cette procédure stockée; La question n'était pas sur le SQL dynamique. Si vous déposez / créez ou modifiez la procédure, vous verrez le plan PROC DISPLAIER, mais tout adhoc ou préparé des plans résultant de la dynamique. SQL restera, car ils ne sont pas directement associés à la procédure (et peuvent être partagés avec d'autres procédures, ou code ad hoc, qui appelle exactement les mêmes états avec les mêmes paramètres de session exacts).



4
votes

oui. Bien sûr, cela est facile à tester:

  1. Créer une procédure
  2. l'exécuter quelques fois
  3. confirmez qu'il est mis en cache en cochant SYS.DM_EXEC_CACHED_PLAN
  4. modifier la procédure
  5. la ligne de sys.dm_exec_cached_plans est parti XXX

    mais si votre procédure a dynamique SQL, le plan Proc disparaîtra, mais des plans d'enfants ( adhoc / préparé ) restera. xxx

    résultats: xxx

    maintenant, modifier la procédure (mais de telle manière qu'elle reste produit le même SQL): xxx

    la requête ci-dessus rendement: xxx

    Bien sûr que ce n'est pas un état permanent - D'autres requêtes et autres pressions de mémoire sur le système dicteront combien de temps ces requêtes ad hoc restent dans le cache.


0 commentaires

1
votes

Cela fait - mais il peut y avoir d'autres facteurs.

Parfois avec de graves problèmes de performances, j'ai constaté que l'exécution explicitement sur dBCC FreeProccaCaCaCaCaCaCaCaCaCaCache peut améliorer considérablement les performances du système. Bien sûr, vous pouvez également expliquer explicitement le cache pour une seule SPUCT si vous savez que cela pose des problèmes.


2 commentaires

Est-ce dans une situation où le cache de plan est plein de nombreuses requêtes adhoc à usage unique ou quelque chose? Si cela optimise pour les charges de travail Adhoc pourrait être une option.


Pour être honnête, j'ai vu cela plusieurs fois, j'ai passé beaucoup de temps dessus la première fois à essayer de résoudre - eu des entrepreneurs dans et tout. Nous ne sommes jamais arrivés à la cause de la route seulement découvert qu'après beaucoup de mises à jour de base de données, il était parfois nécessaire d'appeler dbcc libresProctacaccaché .