Tenemos una aplicación estándar que utiliza una base de datos Microsoft SQL. Dentro de esta aplicación, seleccionamos varios criterios de selección para cada informe. Esta aplicación luego ejecuta estos informes.
Creo que tenemos un problema con el plan de consulta. El primer informe que ejecutamos cada día, se ejecuta muy rápido 7 minutos. Cualquier informe que ejecutemos después del primer informe lleva más de una hora.
Cada noche ejecutamos una tarea programada que detiene e inicia el Agente SQL Server y SQL Server. Hay aproximadamente otras 25 bases de datos dentro de esta instancia de SQL Server. Ninguna otra base de datos tiene problemas de rendimiento, solo el producto estándar que mencioné anteriormente.
¿Hay alguna manera de borrar todos los planes de consulta que SQL Server tiene actualmente en la memoria?
¿Cómo puedo hacer esto sin afectar a unos 30 usuarios que dependen de otras bases de datos en el mismo servidor?
fuente
Respuestas:
Mis disculpas por mi respuesta anterior.
1) Agregue la opción WITH RECOMPILE a la instrucción CREATE PROCEDURE si sabe que su consulta variará cada vez que se ejecute desde el procedimiento almacenado. La opción WITH RECOMPILE evita la reutilización del plan de ejecución del procedimiento almacenado, por lo que SQL Server no almacena en caché un plan para este procedimiento y el procedimiento se vuelve a compilar en tiempo de ejecución. El uso de la opción WITH RECOMPILE puede aumentar el rendimiento si su consulta variará cada vez que se ejecuta desde el procedimiento almacenado porque en este caso no se utilizará el plan de ejecución incorrecto.
2) Debe crear una guía de plan que use una sugerencia de consulta USE PLAN para cada tipo de consulta (cada tipo de solicitud de procedimiento almacenado) para forzar el plan de ejecución.
Aquí hay un artículo sobre el plan de ejecución que puede ayudar.
fuente
Hiciste dos preguntas aquí. Primero, desea saber si puede eliminar todos los planes almacenados en la memoria para una instancia de SQL. Eso se hace con DBCC FREEPROCCACHE como Matt M. sugirió.
La segunda pregunta que hizo es "¿Cómo puedo hacer esto sin afectar a más o menos 30 usuarios que dependen de otras bases de datos en el mismo servidor?". La respuesta corta es "no puedes". Si elimina todos los planes, los otros usuarios que dependen de los planes que están en la memoria probablemente sufrirán un impacto en el rendimiento.
La solución para esto requiere alguna intervención manual. Puede usar DBCC FREEPROCCACHE para eliminar planes específicos siempre que tenga el plan_handle.
Por lo que está describiendo anteriormente, suena como un problema de plan, pero no estoy seguro de que eliminar planes sea la respuesta. Te diría en la dirección de la detección de parámetros antes de pensar en eliminar planes:
http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/08/11/conor-vs-misbehaving-parameterized-queries-optimize-for-hints.aspx
Debería poder optimizar las consultas en lugar de perder el tiempo con DBCC FREEPROCCACHE de forma programada. También le aconsejaría que dedique tiempo a analizar los eventos de espera para su instancia.
fuente
DBCC FREEPROCCACHE
Con este comando, puede borrar todo el caché del procedimiento en un solo comando. Definitivamente lea la documentación antes de usar este comando. Lea la sección de Comentarios algunas veces.
Borrar el caché de procedimientos hará que los cachés de procedimientos almacenados se vuelvan a compilar en el próximo uso. Esto podría afectar el rendimiento. Use con cuidado!
Mate
fuente