Avant d'exécuter un test de performances / une ligne de base pour une application qui utilise SQL Server, je veux pouvoir définir l'instance sur un état "propre", sans redémarrer l'instance. Il y a des étapes que j'ai tendance à suivre, mais je veux construire une liste définitive qui est dans la séquence correcte et n'a pas d'étapes redondantes.
Cette liste d'étapes permet-elle de définir SQL Server sur un état «propre»?
La séquence est-elle logique / correcte?
Y a-t-il des étapes redondantes?
CHECKPOINT -- Write all dirty pages
DBCC DROPCLEANBUFFERS -- All should be clean after checkpoint?
DBCC FREEPROCCACHE -- Clear the plan cache
DBCC FREESYSTEMCACHE -- Is this necessary after FREEPROCCACHE?
DBCC FREESESSIONCACHE -- May not be necessary if distributed queries aren't used, but want to catch all scenarios
EXEC SP_UPDATESTATS -- Refresh stats
'BEGIN TESTING!'
sql-server
dbcc
performance-testing
cache
Eric Higgins
la source
la source
DROPCLEANBUFFERS
est agréable à tester mais pas toujours précis. Si vous faites référence à une table à volume élevé, il est très probable que vous ayez presque toujours des pages en mémoire, et le temps d'E / S ne sera pas un facteur important dans cette requête. Vous pouvez placer plus de poids sur IO que ce qui est réaliste dans ce cas.Réponses:
Tout d'abord, je prendrais du recul et demanderais quelles mesures vous prévoyez de collecter pendant le test. Si vous comptez des lectures logiques par requête, par exemple, vous n'avez pas besoin de libérer le cache. Je suis un grand fan de l'utilisation des lectures logiques car cela est indépendant du fait que les données soient mises en cache ou sur disque - et en production, il est difficile de deviner si les données d'une requête seront mises en cache ou non (sauf si vous mettez en cache la base de données entière en mémoire) . Si vous réglez pour minimiser les lectures logiques, l'application ira plus vite, que les données soient en cache ou non.
Ensuite, je me demande ce qui change entre les exécutions. Par exemple, en exécutant EXEC SP_UPDATESTATS dans chaque base de données comme vous l'avez suggéré, vous allez rééchantillonner les statistiques des tables qui ont été mises à jour. Cependant, à moins que vous ne mettiez à jour les statistiques avec fullscan, vous obtenez des lignes aléatoires de la table - ce n'est pas trop répétable, et je ne pense pas que vous vouliez vraiment le faire. Au lieu de cela, vous souhaiterez peut-être restaurer les bases de données entre chaque exécution afin de toujours tester exactement les mêmes données. Si vos tests effectuent des insertions / mises à jour / suppressions, ils peuvent avoir des profils de performances différents à chaque exécution si vous ne restaurez pas la base de données (car ils ajoutent / modifient des données, ainsi que des statistiques changeantes sur les données) - et pire encore,
la source