Nous avons une requête SQL Server 2008 particulière (pas un proc stocké, mais la même chaîne SQL - s'exécute toutes les 5 minutes) qui met en cache par intermittence un très mauvais plan de requête.
Cette requête s'exécute normalement en quelques millisecondes, mais avec ce mauvais plan de requête, cela prend plus de 30 secondes.
Comment supprimer chirurgicalement le seul plan de requête mis en cache incorrect de SQL Server 2008, sans effacer l'intégralité du cache de requêtes sur le serveur de base de données de production?
sql-server
sql-server-2008
cache
query
Jeff Atwood
la source
la source
Réponses:
J'ai compris quelques trucs
affichera tous les plans de requête mis en cache. Malheureusement, aucun texte SQL n'y est affiché.
Cependant, vous pouvez joindre le texte SQL aux plans comme suit:
À partir d'ici, il est assez simple d'ajouter une
WHERE
clause pour trouver le SQL que je connais dans la requête, puis je peux exécuter:pour supprimer chaque plan de requête du cache du plan de requête. Pas vraiment facile ni pratique, mais cela semble fonctionner.
edit: vider l' intégralité du cache de requête fonctionnera également et est moins dangereux qu'il n'y paraît, du moins d'après mon expérience:
la source
Si vous savez à quoi ressemble le bon plan, utilisez simplement un indice de plan .
Vous ne pouvez pas supprimer une entrée de cache spécifique, mais vous pouvez nettoyer un pool de cache complet avec
DBCC FREESYSTEMCACHE(cachename/poolname)
.Vous pouvez obtenir le nom de cache d'un mauvais plan de requête si vous disposez du descripteur de plan (à partir de sys.dm_exec_requests.plan_handle pour le session_id en difficulté pendant l'exécution, ou à partir de sys.dm_exec_query_stats après l'exécution):
Cependant, tous les plans SQL ont le nom «Plans SQL», ce qui rend le choix du bon pour DBCC FREESYSTEMCACHE un choix difficile.
Mise à jour
Peu importe, oublié
DBCC FREEPROCCACHE(plan_handle)
, oui cela fonctionnera.la source
sys.dm_exec_cached_plans
n'y a aucune entrée pour leplan_handle
fromsys.dm_exec_requests
?La solution FREEPROCCACHE est très bien, mais une façon plus directe de le faire est d'utiliser OPTION (RECOMPILE) sur votre chaîne SQL (vous avez mentionné que ce n'était pas un SP), cela indique au moteur que c'est un plan à usage unique, car vous suspectez probablement il y a un reniflage de paramètres ou vos statistiques sont radicalement différentes d'une exécution à l'autre et vous pensez que c'est un problème de plan mis en cache.
la source