Comment pouvez-vous effacer tous les anciens plans de requête à partir de Microsoft SQL Server?

dba.stackexchange https://dba.stackexchange.com/questions/530

  •  16-10-2019
  •  | 
  •  

Question

Nous avons une large application de stockage qui utilise une base de données Microsoft SQL. Au sein de cette application, nous choisissons différents critères de sélection pour chaque rapport. Cette application exécute ensuite ces rapports.

Je crois que nous avons un problème de plan de requête. Le premier rapport, nous courons chaque jour, court très vite 7 minutes. Tout rapport que nous courons après le premier rapport prend plus d'une heure.

Chaque soir, nous courons une tâche planifiée qui arrête et démarre l'Agent SQL Server et SQL Server. Il y a environ 25 autres bases de données dans ce une instance de SQL Server. Aucune autre base de données ont des problèmes de performance, seul celui du produit hors du plateau je l'ai mentionné plus tôt.

Y at-il un moyen d'effacer tous les plans de requête SQL Server a actuellement en mémoire?

Comment puis-je faire cela sans impact sur 30 ou si les utilisateurs qui comptent sur d'autres bases de données sur le même serveur?

Était-ce utile?

La solution

Je présente mes excuses pour ma réponse précédente.

1) Ajouter l'option WITH RECOMPILE à l'instruction CREATE PROCEDURE si vous savez que votre requête varie chaque fois qu'il est exécuté à partir de la procédure stockée. L'option AVEC recompiler empêche la réutilisation du plan d'exécution de la procédure stockée, de sorte que SQL Server ne cache pas un plan pour cette procédure et la procédure est recompilée au moment de l'exécution. En utilisant l'option WITH RECOMPILE peut améliorer les performances si votre requête varie chaque fois qu'il est exécuté à partir de la procédure stockée parce que dans ce cas, le plan d'exécution mal ne sera pas utilisé.

2) Vous devez créer un guide de plan qui utilise un USE l'indice de plan de requête pour chaque type de requête (chaque type de requête de procédure stockée) au plan d'exécution de la force.

Voici article sur le plan d'exécution qui aide peut.

Autres conseils

Vous avez posé deux questions. Tout d'abord, vous voulez savoir si vous pouvez supprimer tous les plans stockés dans la mémoire pour une instance de SQL. Cela se fait avec DBCC FREEPROCCACHE comme Matt M suggéré.

La deuxième question que vous posez est: « Comment puis-je faire cela sans impact sur 30 ou si les utilisateurs qui comptent sur d'autres bases de données sur le même serveur? ». La réponse courte est « vous ne pouvez pas ». Si vous supprimez tous les plans que les autres utilisateurs qui comptent sur les plans étant en mémoire souffriront probablement un impact sur les performances.

La solution de contournement pour cela nécessite une intervention manuelle. Vous pouvez utiliser DBCC FREEPROCCACHE pour supprimer des plans spécifiques à condition que vous avez le plan_handle.

D'après ce que vous décrivez au-dessus ne sonne comme un problème de plan, mais je ne suis pas certain que la suppression des plans est la réponse. Je vous diriger dans la direction du paramètre renifler avant de penser à la suppression des plans:

http : //blogs.msdn.com/b/conor_cunningham_msft/archive/2010/08/11/conor-vs-misbehaving-parameterized-queries-optimize-for-hints.aspx

Vous devriez être en mesure d'optimiser les requêtes plutôt que niaisage avec DBCC FREEPROCCACHE sur une base régulière. Je voudrais également vous informer que vous passez de temps à analyser les événements d'attente pour votre instance.

DBCC FREEPROCCACHE

Cette commande, vous pouvez effacer l'ensemble vers le bas du cache de procédure à une seule commande. Certainement lire la documentation avant d'utiliser cette commande. Lire la section Remarques quelques fois.

Effacement du cache de procédure entraîne des caches de procédures stockées recompilation lors de la prochaine utilisation. Cela pourrait influer sur les performances. Utilisez soigneusement!

Matt

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top