web-dev-qa-db-fra.com

Devrais-je rafraîchir le cache plan de requête

S'il vous plaît laissez-moi vous expliquer mon problème et ma situation:

J'ai une application Web - MVC3, MSSQL Server 2005, LINQTOSQL. Il fonctionnait bien jusqu'à une belle matinée, j'ai poussé beaucoup de rangées à une table fortement utilisée et depuis lors, je reçois des délais d'attente de requête. Afin de résoudre le problème, j'exécute le conseiller de syntonisation de la base de données et j'ai ajouté des index et des statistiques. J'ai également créé un plan de maintenance pour reconstruire quotidiennement index. Après ces ajouts, l'application se comporte instable; Cela fonctionnerait vite pendant quelques heures, alors cela commencerait à reprendre plusieurs heures. Ensuite, la vie m'a forcé à nettoyer la table en la matière et la quantité de lignes dedans est encore plus petite maintenant qu'auparavant, mais les délais d'attente se produisent toujours. Donc, j'ai supprimé tous les index que j'ai créés et maintenant le site Web est beaucoup plus stable, mais de temps à autre, je vois toujours des délais d'attente.

J'essaie de comprendre comment résoudre ces questions et lorsque je le profile et collez la requête directement dans le studio de gestion SQL, il renvoie les résultats en 1 seconde, mais lorsque j'exécute cette requête de mon application, il est environ 25 secondes. . Ensuite, après cela fonctionne pour la première fois, la prochaine fois qu'il va aussi vite que sur le serveur!

J'ai commencé à faire des recherches et on dirait quand j'ai joué avec tous ces index, mes plans de requête ont été gâchés et ils créent désormais des problèmes.

Mes questions sont:

  1. Devrais-je rafraîchir mon cache de plan de requête (environ 22 000 requêtes - beaucoup d'entre eux n'ont été utilisées qu'une fois) et
  2. Si je le fais, quel serait l'impact sur le SQL pendant qu'ils reconstruisent tous?
5
bobek

Tout d'abord, non, vous ne devriez probablement pas effacer votre cache de plan de requête. Vous avez probablement un problème avec un mauvais paramètre reniflant. Voici quelques articles à ce sujet par diverses personnes. Greg Larson avec SimpleTalk , Jes Schultz Borland avec Brent Ozar Unlimited et Thomas Larock . Vous pouvez faire une recherche rapide et vous verrez des tonnes d'autres. C'est un sujet populaire.

La première chose que je ferais si j'étais que vous mettez des statistiques de mise à jour pour chaque table affectée.

update statistics TableName;

Exécuter ensuite SP_Recompile sur les tables concernées. Cela recompilera toutes les procédures stockées associées à cette table. Cela aura un impact sur l'impact (je vais expliquer un instant) mais c'est mieux que d'éliminer votre cache entière.

EXEC sp_recompile Table;

Lorsque vous désactivez le cache de votre plan de requête ou marquez une procédure stockée pour recompiler, l'optimiseur doit recréer le plan de ce morceau de code. Cela prend bien sûr du temps. Et si vous avez un système actif qui élimine complètement votre cache ralentira tout votre système pendant une période de temps alors que tout est recréé. Bien sûr, chaque requête/SP ne sera ré-créée que lorsqu'elle est utilisée.

7
Kenneth Fisher