Comment obtenir des performances de requête précises?

9

J'essaie d'améliorer les performances d'une procédure stockée. Lorsque j'exécute le SP, il se termine presque instantanément, comme si quelque chose était mis en cache. On m'a dit d'utiliser les deux lignes SQL suivantes avant d'exécuter le SP dans SSMS:

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

Lorsque j'exécute le SP avec les deux lignes de code au-dessus, le SP se termine en environ 8 secondes. Cependant, cela me donne-t-il vraiment le temps d'exécution réel (comme si je l'exécutais à partir d'une application)? Comment puis-je savoir?

OO
la source

Réponses:

9

Ces commandes font deux choses:

  • Vider le cache de pages, qui stocke les pages de données qui ont déjà été récupérées du disque (normalement, le plus grand facteur de temps dans une requête est l'accès au disque)
  • Videz le cache du plan de requête, ce qui signifie que le serveur doit créer un nouveau plan de requête. Ceci n'est normalement pas significatif, sauf pour des volumes de transactions très élevés.

Vous obtenez essentiellement une heure équivalente au "pire des cas" - vous venez de redémarrer le serveur et rien n'est en mémoire. Les exécutions suivantes n'ont pas à payer le coût pour extraire les données du disque car ces pages sont déjà chargées en mémoire.

Ceci est similaire à une situation réelle - votre premier utilisateur à exécuter une requête particulière devra probablement attendre plus longtemps que lors des exécutions suivantes, en supposant que vous vérifiez les mêmes données.

Une bonne méthode que j'aime utiliser est d'exécuter plusieurs fois et de prendre une moyenne. Cela est particulièrement utile dans un environnement partagé car vous n'avez pas le contrôle total sur les ressources partagées comme tempdb.

Vous pouvez également utiliser ces commandes pour obtenir plus d'informations sur ce qui se passe réellement dans les coulisses:

SET STATISTICS IO ON
SET STATISTICS TIME ON

Ceux-ci vous donneront des informations détaillées sur les lectures de page à partir du disque (par objet), les lectures de page logique, le temps passé à compiler un plan et le temps passé à exécuter une requête.

JNK
la source
excellente réponse comme d'habitude JNK.
OO
Heureux d'aider! Il se trouve que vous posez des questions sur des choses que j'ai souvent traitées. Si vous posez des questions sur la réplication ou la gestion de la mémoire, je n'aurai pas grand-chose à ajouter :)
JNK
2
Je connaissais SET STATISTICS IO ON, mais je n'ai jamais connu SET STATISTICS TIME ON. Merci JNK.
datagod
2
Pour info, vous pouvez obtenir une grande partie de ces informations sans tous les paramètres SET en générant des plans réels à l'aide de SQL Sentry Plan Explorer. Et pour obtenir plusieurs (disons, 5) exécutions, vous pouvez simplement terminer le lot avec GO 5comme dans SSMS. C'est un téléchargement gratuit, je n'essaie pas de vous vendre quoi que ce soit. sqlsentry.net/plan-explorer/sql-server-query-view.asp
Aaron Bertrand
1
@JNK eh bien, bien sûr, c'est gratuit, cela fait gagner du temps et il affiche des informations qui sont soit impossibles, soit très lourdes à sortir de Management Studio. Et j'y travaille. :-)
Aaron Bertrand