Antes de ejecutar una prueba de rendimiento / línea de base para una aplicación que utiliza SQL Server, quiero poder establecer la instancia en un estado "limpio", sin reiniciar la instancia. Hay pasos que suelo seguir, pero quiero construir una lista definitiva que esté en la secuencia correcta y que no tenga pasos redundantes.
¿Esta lista de pasos logra configurar SQL Server en un estado "limpio"?
¿Es la secuencia lógica / correcta?
¿Hay pasos redundantes?
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
fuente
fuente
DROPCLEANBUFFERS
es bueno para las pruebas, pero no siempre es preciso. Si hace referencia a una tabla de alto volumen, es muy probable que casi siempre tenga páginas en la memoria, y el tiempo de E / S no será un factor importante en esa consulta. Puede estar poniendo más peso en IO de lo que es realista en ese caso.Respuestas:
Primero, daría un paso atrás y le preguntaría qué medidas planea recolectar durante la prueba. Si está contando lecturas lógicas por consulta, por ejemplo, no necesita liberar el caché. Soy un gran admirador del uso de lecturas lógicas porque es independiente de si los datos están en caché o en el disco, y en producción, es difícil adivinar si los datos de una consulta se almacenarán en caché o no (a menos que guarde en caché toda la base de datos en la memoria) . Si sintoniza para minimizar las lecturas lógicas, la aplicación irá más rápido si los datos están en caché o no.
A continuación, me preguntaría qué está cambiando entre las ejecuciones. Por ejemplo, al ejecutar EXEC SP_UPDATESTATS en cada base de datos como ha sugerido, volverá a muestrear las estadísticas de las tablas que se han actualizado. Sin embargo, a menos que esté actualizando estadísticas con fullscan, obtendrá filas aleatorias de la tabla; eso no es demasiado repetible, y no creo que realmente quiera hacerlo. En cambio, es posible que desee restaurar las bases de datos entre cada ejecución para que siempre esté probando exactamente los mismos datos. Si sus pruebas están haciendo inserciones / actualizaciones / eliminaciones, pueden tener diferentes perfiles de rendimiento en cada ejecución si no está restaurando la base de datos (porque están agregando / cambiando datos, además de cambiar las estadísticas de los datos), y peor aún,
fuente