DBCC FREEPROCCACHE
ne fonctionne pas dans Azure SQL DB. Sinon, comment puis-je forcer un plan à se retirer du cache d'une manière qui ne nuira pas à un système de production (c'est-à-dire que je ne peux pas simplement modifier les tables à volonté)? Ceci est spécifiquement pour SQL créé par Entity Framework, donc ce ne sont pas des procs stockés autogérés - c'est effectivement du SQL dynamique.
(La source était de mauvais index -> de mauvaises statistiques, etc. Tout est corrigé, mais un mauvais plan ne disparaîtra pas.)
MISE À JOUR: J'ai choisi la solution de @ mrdenny comme il est arrivé en premier. Cependant, j'utilise avec succès le script de @Aaron Bertrand pour effectuer le travail. Merci à tous pour l'aide !!
sp_executesql
.Réponses:
Azure SQL prend désormais directement en charge cette
Azure SQL Database prend directement en charge la suppression du cache de proc de la base de données utilisateur actuelle sans aucun piratage:
Information additionnelle
Le script suivant (par Shannon Gowen ) peut être utilisé pour regarder le processus étape par étape:
la source
Il n'y a pas de moyen explicite de le faire aujourd'hui, mais ce n'est pas un scénario permanent (la commande DBCC n'est toujours pas prise en charge, mais lisez sur Query Store ). Même lorsque le hit de changement de schéma est acceptable, il peut ne pas être ce que vous voulez, car il invalidera tous les plans liés à l'objet sous-jacent, pas seulement le mauvais.
Ne pas chercher de crédit pour cela, mais créer du SQL dynamique pour effectuer la même opération sur plusieurs tables est assez facile:
(J'ai écrit un conseil sur ce problème de "longueur du SQL dynamique" ...)
la source
nvarchar(max)
variable atteint une limite après 4000 caractères, 8000 caractères si je la changevarchar(max)
. Exécuter ce script exact. Nous avons ~ 450 tables, donc nous avons atteint facilement (~ 30/60 tables).varchar(max)
est une syntaxe valide, elle est juste identique àvarchar(8000)
etnvarchar(max)
est identique ànvarchar(4000)
.PRINT
la commande, elle n'affiche que 8000 octets. C'est une limitation de laPRINT
commande, pas Azure. Si vous exécutez la commande, cela fonctionnera même si vous ne pouvez pas inspecter visuellement le tout.Ajoutez une colonne nullable au tableau, puis supprimez la colonne. Cela forcera SQL à vider le cache de cet objet.
Quant à faire tous les tableaux, un curseur devrait faire l'affaire. Utilisez simplement un nom de colonne qui n'existera jamais dans aucune table comme 'zzzzzz_go_away' ou quelque chose.
la source
Azure SQL Database ne prend actuellement pas en charge
DBCC FREEPROCCACHE
, vous ne pouvez donc pas supprimer manuellement un plan d'exécution du cache. Cependant, si vous apportez des modifications à une table ou à une vue référencée par la requête (ALTER TABLE
/ALTER VIEW
), le plan sera supprimé du cache. ( Référence .)la source
Pour effacer tout le plan d'exécution, utilisez ceci:
Si vous modifiez une table ou une vue qui y fait référence, le plan d'exécution est effacé.
Un peu plus expliqué ici http://christianarg.wordpress.com/2013/08/22/remove-execution-plans-from-the-procedure-cache-in-sql-azure/
la source