Cuando estoy probando una consulta, generalmente coloco las siguientes líneas delante de lo que estoy probando para asegurarme de que empiezo desde la misma línea base cada vez que ejecuto una consulta.Caché de cebado o calentamiento en SQL Server
CHECKPOINT
GO
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
EXEC sp_MyProc 12345
En el procedimiento almacenado que estaba corriendo hoy me di cuenta de que cuando me encontré con estas líneas que tomó Aproximadamente 18 minutos cada vez. Cuando dejé estas líneas solo tardé 3. Al ver la drástica diferencia causada por tener un caché borrado frente a un caché preparado, decidí agregar lo siguiente para ver si podía preparar el caché manualmente antes de ejecutar mi proceso y ver qué hacía eso. actuación.
CHECKPOINT
GO
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
SELECT top 1 '1' from Table1
EXEC sp_MyProc 12345
Como puede haber adivinado sp_MyProc
utiliza Table1
un poco. Me sorprendió descubrir que al hacer esto, mi tiempo de ejecución se redujo a aproximadamente 6 minutos constantemente. Aunque mejora el rendimiento, parece un poco hackish, y tengo curiosidad de saber si hay algo integrado en SQL Server que logre esto.
- está haciendo esto para mejorar el rendimiento de las consultas no escuchadas de ?
- ¿Estoy incluso en lo cierto al suponer que la mejora en el tiempo que vi fue el resultado de un caché "imprimado"?
Si mi comprensión del almacenamiento en caché es un poco apagado, siéntase libre de compartir cualquier enlace o información que considere útil.
ACTUALIZACIÓN: Bueno, me da vergüenza decir que traté de reproducir este comportamiento hoy, pero no pude. Hablé con algunas personas en mi trabajo y parece que algunas de las cosas que estaban haciendo en el DB ayer pueden haber hecho parecer que mi selección antes del proceso mejoraba el rendimiento cuando en realidad no era así. Todavía estaría interesado en saber si alguien sabe si es posible "preparar" el caché.
+1 Buena pregunta, aunque me sorprende que la selección pre TOP 1 haya hecho alguna diferencia, ya que no habría pensado que realmente habría cargado datos relevantes en el caché que sp_MyProc necesita. – AdaTheDev
He estado jugando con esto y no puedo reproducir el comportamiento. La única diferencia entre todo lo que he intentado es el número de lecturas de lectura anticipada realizadas (cuando no borra los búferes limpios), pero los tiempos son consistentemente los mismos. Mi tabla de muestra tiene 4.000,000 filas. ¿Podría ser algo relacionado con los índices? Mi tabla de muestra tiene varios índices (tanto exclusivos como exclusivos), así como una clave principal agrupada. – adrianbanks